TypeError를 극복하는 방법: 캐시할 수 없는 유형: '리스트'
다음과 같은 파일을 가져오려고 합니다.
AAA x 111
AAB x 111
AAA x 112
AAC x 123
...
그리고 사전을 사용해서 이렇게 출력합니다.
{AAA: ['111', '112'], AAB: ['111'], AAC: [123], ...}
이게 내가 시도했던 것이다.
file = open("filename.txt", "r")
readline = file.readline().rstrip()
while readline!= "":
list = []
list = readline.split(" ")
j = list.index("x")
k = list[0:j]
v = list[j + 1:]
d = {}
if k not in d == False:
d[k] = []
d[k].append(v)
readline = file.readline().rstrip()
계속...TypeError: unhashable type: 'list'
사전의 키가 목록이 될 수 없다는 것을 알지만, 내 값을 키가 아닌 목록으로 만들려고 합니다.제가 어디선가 실수를 한 건 아닌지 궁금하네요.
다른 답변에서 알 수 있듯이 오류의 원인은 다음과 같습니다.k = list[0:j]
여기서 키가 목록으로 변환됩니다.한 가지 시도해 볼 수 있는 것은 코드를 다시 작성하여split
기능:
# Using with ensures that the file is properly closed when you're done
with open('filename.txt', 'rb') as f:
d = {}
# Here we use readlines() to split the file into a list where each element is a line
for line in f.readlines():
# Now we split the file on `x`, since the part before the x will be
# the key and the part after the value
line = line.split('x')
# Take the line parts and strip out the spaces, assigning them to the variables
# Once you get a bit more comfortable, this works as well:
# key, value = [x.strip() for x in line]
key = line[0].strip()
value = line[1].strip()
# Now we check if the dictionary contains the key; if so, append the new value,
# and if not, make a new list that contains the current value
# (For future reference, this is a great place for a defaultdict :)
if key in d:
d[key].append(value)
else:
d[key] = [value]
print d
# {'AAA': ['111', '112'], 'AAC': ['123'], 'AAB': ['111']}
Python 3.x 를 사용하고 있는 경우는, 올바르게 동작하기 위해서 약간의 조정을 실시할 필요가 있습니다.파일을 여는 경우rb
, 를 사용해야 합니다.line = line.split(b'x')
(이를 통해 적절한 유형의 문자열로 바이트를 분할할 수 있습니다).다음 방법으로 파일을 열 수도 있습니다.with open('filename.txt', 'rU') as f:
(혹은 심지어with open('filename.txt', 'r') as f:
정상적으로 동작합니다.
주의: 이 답변은 질문에 대한 명확한 답변이 아닙니다.다른 대답들도 그렇게 해이 질문은 시나리오에 고유하고 발생한 예외가 일반적이기 때문에 이 답변은 일반적인 경우를 가리킵니다.
해시 값은 사전 검색 중에 사전 키를 빠르게 비교하는 데 사용되는 정수입니다.
내부적으로는hash()
메서드 호출__hash__()
모든 개체에 대해 기본적으로 설정된 개체의 메서드입니다.
중첩 목록을 세트로 변환
>>> a = [1,2,3,4,[5,6,7],8,9]
>>> set(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
이는 해시할 수 없는 목록인 목록 내의 목록 때문에 발생합니다.내부 네스트 리스트를 태플로 변환하여 해결할 수 있습니다.
>>> set([1, 2, 3, 4, (5, 6, 7), 8, 9])
set([1, 2, 3, 4, 8, 9, (5, 6, 7)])
중첩 목록을 명시적으로 해싱
>>> hash([1, 2, 3, [4, 5,], 6, 7])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> hash(tuple([1, 2, 3, [4, 5,], 6, 7]))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> hash(tuple([1, 2, 3, tuple([4, 5,]), 6, 7]))
-7943504827826258506
이 오류를 방지하는 방법은 리스트 대신 중첩된 튜플을 가지도록 리스트를 재구성하는 것입니다.
사용하려고 합니다.k
(목록)의 키로서d
목록은 가변이며 dict 키로 사용할 수 없습니다.
또한 다음 행 때문에 사전에서 목록을 초기화하지 않습니다.
if k not in d == False:
다음 중 어느 것이 좋습니까?
if k not in d == True:
실제로는 다음과 같습니다.
if k not in d:
unhashable type: 'list'
예외는 때문이다k = list[0:j]
k
논리적으로 다른, 종종 더 짧은 목록인 목록의 "일시"가 됩니다.첫 .k = list[0]
에 대해서도 마찬가지입니다.v = list[j + 1:]
''으로 해야 요.v = list[2]
의 세 요소에 는, 「」로 합니다.readline.split(" ")
.
코드에 몇 가지 문제가 있을 수 있다는 것을 알게 되었습니다.아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아.은 '하고 않다는 입니다.d
d = {}
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★또, 통상, 변수의 이름을 짜넣기 타입과 같이 붙이는 것은 좋지 않습니다.필요에 따라서, 어느쪽인가를 액세스 할 수 없게 되기 때문입니다.또, 이러한 표준 아이템의 이름을 붙이는 것에 익숙한 다른 유저에게는 혼란이 생기기 때문입니다. 때문에 이름을 .list
그런 문제를 피하기 위해 뭔가 다른 것을 변화시킵니다.
이 버전도 했습니다.if
키가 사전에 있는지 확인하고 사전의 방법을 사용하여 동일한 작업을 좀 더 간결하게 수행할 수 있습니다.
d = {}
with open("nameerror.txt", "r") as file:
line = file.readline().rstrip()
while line:
lst = line.split() # Split into sequence like ['AAA', 'x', '111'].
k, _, v = lst[:3] # Get first and third items.
d.setdefault(k, []).append(v)
line = file.readline().rstrip()
print('d: {}'.format(d))
출력:
d: {'AAA': ['111', '112'], 'AAC': ['123'], 'AAB': ['111']}
그 이유는 이 목록에 값 목록이 포함되어 있기 때문입니다.예를 들어 다음과 같습니다.
a = [[1,2],[1,2],[3,4]]
그리고 이것은 다음과 같은 경우에는 작동하지 않습니다.
list(set(a))
이 문제를 해결하려면 다음과 같이 내부 목록을 태플로 변환합니다.
a = [(1,2),(1,2),(3,4)]
이거면 될 거야!
TypeError
일이 일어나는 이유는k
는 다른 입니다.다른 리스트의 슬라이스를 사용하여 작성됩니다.k = list[0:j]
. '이러다'와 같은 될k = ' '.join(list[0:j])
대신 문자열이 있습니다.
외에도,의 ★★★★★★★★★★★★★★★★★★★★★★★★★★.if
에서 알 수 이 답변은 "Jesse"로 되어 있을 입니다.if k not in d
★★★★★★★★★★★★★★★★★」if not k in d
( 가가 ( ( )
'을 지우다'가 있기 을 지웁니다.d = {}
for
loopsyslog.syslog..syslog.
, 이 경우는 것도 해 주세요.list
★★★★★★★★★★★★★★★★★」file
기본 제공 기능을 마스킹하게 되므로 변수 이름으로 지정합니다.
코드를 다시 쓰는 방법은 다음과 같습니다.
d = {}
with open("filename.txt", "r") as input_file:
for line in input_file:
fields = line.split()
j = fields.index("x")
k = " ".join(fields[:j])
d.setdefault(k, []).append(" ".join(fields[j+1:]))
dict.setdefault()
은 ""를 합니다.if k not in d
당신의 코드에서 논리학을 얻습니다.
python 3.2
with open("d://test.txt") as f:
k=(((i.split("\n"))[0].rstrip()).split() for i in f.readlines())
d={}
for i,_,v in k:
d.setdefault(i,[]).append(v)
언급URL : https://stackoverflow.com/questions/13675296/how-to-overcome-typeerror-unhashable-type-list
'sourcecode' 카테고리의 다른 글
날짜 문자열에 대한 Oracle to_date 함수 사용(밀리초) (0) | 2023.04.18 |
---|---|
SQL Server가 대소문자를 무시하는 식입니다. (0) | 2023.04.13 |
Windows(v10)에서 Android Studio를 완전히 제거하려면 어떻게 해야 합니까? (0) | 2023.04.13 |
UIDevice uniqueIdentifier가 권장되지 않음 - 이제 어떻게 해야 합니까? (0) | 2023.04.13 |
셸 명령 출력의 첫 줄을 가져옵니다. (0) | 2023.04.13 |