programing

파이썬에서 빈 목록 사전을 초기화하려면 어떻게 해야 합니까?

padding 2023. 8. 21. 20:56
반응형

파이썬에서 빈 목록 사전을 초기화하려면 어떻게 해야 합니까?

목록 사전을 프로그래밍 방식으로 만들려는 시도는 사전 키를 개별적으로 지정하는 것을 허용하지 않습니다.목록 사전을 만들고 하나의 키에 추가하려고 하면 모든 목록이 업데이트됩니다.다음은 매우 간단한 테스트 사례입니다.

data = {}
data = data.fromkeys(range(2),[])
data[1].append('hello')
print data

결과: 실제결과:{0: ['hello'], 1: ['hello']}

결과: 예상결:{0: [], 1: ['hello']}

효과는 다음과 같습니다.

data = {0:[],1:[]}
data[1].append('hello')
print data

및 결과:{0: [], 1: ['hello']}

가 왜?fromkeys방법이 예상대로 작동하지 않습니까?

[] 두 번째 인수로 전달됩니다.dict.fromkeys()으로 의과모값에 값dict동일할 것입니다. list물건.

Python 2.7 이상에서는 대신 딕트 이해를 사용합니다.

data = {k: [] for k in range(2)}

Python에서는 이해는 는 버에전의 전달될 수 있습니다.dict대신 생성자:

data = dict([(k, []) for k in range(2)])

2.4-2.6으로 .dict주변 괄호를 삭제할 수 있습니다.

data = dict((k, []) for k in range(2))

대신 기본 명령어를 사용해 보십시오.

from collections import defaultdict
data = defaultdict(list)
data[1].append('hello')

이렇게 하면 미리 빈 목록으로 키를 초기화할 필요가 없습니다.defaultdict()개체는 아직 존재하지 않는 키에 액세스할 때마다 해당 개체에 부여된 공장 함수를 호출합니다.에서는 에 접속하려고 합니다.data[1] 트거data[1] = list()내부적으로 해당 키에 새 빈 목록을 값으로 지정합니다.

이 있는 원래 입니다..fromkeys하나의 (변동 가능한) 목록을 공유합니다.유사하게,

alist = [1]
data = dict.fromkeys(range(2), alist)
alist.append(2)
print(data)

를 출력합니다.{0: [1, 2], 1: [1, 2]}내용은 설명서에 나와 있습니다.

모든 값은 단일 인스턴스만 참조하므로 일반적으로 값이 빈 목록과 같은 변수 개체가 되는 은 의미가 없습니다.

다른 옵션은 가 있는지 처음 확인한 후 키 값을 검색하고 키가 없으면 기본값을 설정하는 방법을 사용하는 것입니다..append그런 다음 결과에 따라 호출할 수 있습니다.

data = {}
data.setdefault(1, []).append('hello')

마지막으로, 알려진 키 목록과 지정된 "템플릿" 목록(각 값이 동일한 요소로 시작해야 하지만 별개의 목록이어야 함)에서 사전을 만들려면 사전 이해를 사용하고 초기 목록을 복사합니다.

alist = [1]
data = {key: alist[:] for key in range(2)}

여기서,alist[:] 복본만다니의 얕은 .alist각 값에 대해 개별적으로 수행됩니다.목록을 복제하여 할당 후 예기치 않게 변경되지 않도록 하려면 어떻게 해야 합니까?를 참조하십시오.목록을 복사하는 데 필요한 추가 기술을 확인하십시오.

받아쓰기 이해력을 사용할 수 있습니다.

>>> keys = ['a','b','c']
>>> value = [0, 0]
>>> {key: list(value) for key in keys}
    {'a': [0, 0], 'b': [0, 0], 'c': [0, 0]}

이 대답은 이 행동을 설명하기 위해 여기에 있습니다. 그들이 인스턴스화하려고 시도한 결과에 당황한 모든 사람들에게.dict와 함께fromkeys()변경 가능한 기본값을 사용하여dict.

고려 사항:

#Python 3.4.3 (default, Nov 17 2016, 01:08:31) 

# start by validating that different variables pointing to an
# empty mutable are indeed different references.
>>> l1 = []
>>> l2 = []
>>> id(l1)
140150323815176
>>> id(l2)
140150324024968

그래서 어떤 변화라도l1영향을 미치지 않음l2그리고 역도 성립.이것은 지금까지 어떤 변형에도 해당될 것입니다.dict.

# create a new dict from an iterable of keys
>>> dict1 = dict.fromkeys(['a', 'b', 'c'], [])
>>> dict1
{'c': [], 'b': [], 'a': []}

이것은 편리한 기능이 될 수 있습니다.여기서 각 키에 빈 목록인 기본값을 할당합니다.

# the dict has its own id.
>>> id(dict1)
140150327601160

# but look at the ids of the values.
>>> id(dict1['a'])
140150323816328
>>> id(dict1['b'])
140150323816328
>>> id(dict1['c'])
140150323816328

실제로 그들은 모두 같은 심판을 사용하고 있습니다!하나에 대한 변화는 모든 사람에게 변화입니다. 왜냐하면 그들은 사실 같은 대상이기 때문입니다!

>>> dict1['a'].append('apples')
>>> dict1
{'c': ['apples'], 'b': ['apples'], 'a': ['apples']}
>>> id(dict1['a'])
>>> 140150323816328
>>> id(dict1['b'])
140150323816328
>>> id(dict1['c'])
140150323816328

많은 사람들에게, 이것은 의도된 것이 아니었습니다!

이제 기본값으로 사용되는 목록의 명시적 복사본을 만드는 것으로 시도해 보겠습니다.

>>> empty_list = []
>>> id(empty_list)
140150324169864

그리고 이제 사본으로 딕트를 만듭니다.empty_list.

>>> dict2 = dict.fromkeys(['a', 'b', 'c'], empty_list[:])
>>> id(dict2)
140150323831432
>>> id(dict2['a'])
140150327184328
>>> id(dict2['b'])
140150327184328
>>> id(dict2['c'])
140150327184328
>>> dict2['a'].append('apples')
>>> dict2
{'c': ['apples'], 'b': ['apples'], 'a': ['apples']}

여전히 즐겁지 않아요!누군가 외치는 소리가 들립니다. 제가 빈 목록을 사용했기 때문입니다.

>>> not_empty_list = [0]
>>> dict3 = dict.fromkeys(['a', 'b', 'c'], not_empty_list[:])
>>> dict3
{'c': [0], 'b': [0], 'a': [0]}
>>> dict3['a'].append('apples')
>>> dict3
{'c': [0, 'apples'], 'b': [0, 'apples'], 'a': [0, 'apples']}

의 기본 동작fromkeys()할당하는 것입니다.None값어치가로

>>> dict4 = dict.fromkeys(['a', 'b', 'c'])
>>> dict4
{'c': None, 'b': None, 'a': None}
>>> id(dict4['a'])
9901984
>>> id(dict4['b'])
9901984
>>> id(dict4['c'])
9901984

실제로 모든 값이 동일합니다(단 하나뿐입니다!).None이제, 무수히 많은 방법 중 하나로, 반복해 봅시다.dict값을 변경합니다.

>>> for k, _ in dict4.items():
...    dict4[k] = []

>>> dict4
{'c': [], 'b': [], 'a': []}

흠. 전과 똑같아 보여요!

>>> id(dict4['a'])
140150318876488
>>> id(dict4['b'])
140150324122824
>>> id(dict4['c'])
140150294277576
>>> dict4['a'].append('apples')
>>> dict4
>>> {'c': [], 'b': [], 'a': ['apples']}

하지만 그들은 정말 다릅니다.[]s, 이 경우에는 의도된 결과였습니다.

다음을 사용할 수 있습니다.

l = ['a', 'b', 'c']
d = dict((k, [0, 0]) for k in l)

단일 목록에 대한 참조로 사전을 채우는 경우 업데이트 시 모든 참조에 업데이트가 반영됩니다.대신 사전 이해를 시도해 보십시오.자세한 내용은 Python에서 목록 이해력이 있는 사전 만들기를 참조하십시오.

d = {k : v for k in blah blah blah}

다음을 사용할 수 있습니다.

data[:1] = ['hello']

언급URL : https://stackoverflow.com/questions/11509721/how-do-i-initialize-a-dictionary-of-empty-lists-in-python

반응형