리스트의 사전을 만드는 파이썬
값이 목록 인 사전을 만들고 싶습니다. 예를 들면 다음과 같습니다.
{
1: ['1'],
2: ['1','2'],
3: ['2']
}
만약 내가한다면:
d = dict()
a = ['1', '2']
for i in a:
for j in range(int(i), int(i) + 2):
d[j].append(i)
d [...]가 목록이 아니기 때문에 KeyError가 발생합니다. 이 경우 a를 할당 한 후 다음 코드를 추가하여 사전을 초기화 할 수 있습니다.
for x in range(1, 4):
d[x] = list()
더 좋은 방법이 있습니까? 두 번째 for
루프 가 될 때까지 필요한 키를 모른다고 가정 해 봅시다. 예를 들면 다음과 같습니다.
class relation:
scope_list = list()
...
d = dict()
for relation in relation_list:
for scope_item in relation.scope_list:
d[scope_item].append(relation)
다른 대안은 대체 될 것입니다
d[scope_item].append(relation)
와
if d.has_key(scope_item):
d[scope_item].append(relation)
else:
d[scope_item] = [relation,]
이것을 처리하는 가장 좋은 방법은 무엇입니까? 이상적으로 추가하면 "그냥 작동"할 것입니다. 처음 목록을 만들 때 모든 키를 모르더라도 빈 목록의 사전을 원한다고 표현하는 방법이 있습니까?
defaultdict 를 사용할 수 있습니다 :
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> a = ['1', '2']
>>> for i in a:
... for j in range(int(i), int(i) + 2):
... d[j].append(i)
...
>>> d
defaultdict(<type 'list'>, {1: ['1'], 2: ['1', '2'], 3: ['2']})
>>> d.items()
[(1, ['1']), (2, ['1', '2']), (3, ['2'])]
다음과 같이 목록 이해를 사용하여 작성할 수 있습니다.
>>> dict((i, range(int(i), int(i) + 2)) for i in ['1', '2'])
{'1': [1, 2], '2': [2, 3]}
And for the second part of your question use defaultdict
>>> from collections import defaultdict
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
d[k].append(v)
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
Use setdefault
:
d = dict()
a = ['1', '2']
for i in a:
for j in range(int(i), int(i) + 2):
d.setdefault(j, []).append(i)
print d # prints {1: ['1'], 2: ['1', '2'], 3: ['2']}
The rather oddly-named setdefault
function says "Get the value with this key, or if that key isn't there, add this value and then return it."
Edit: As others have rightly pointed out, defaultdict
is a better and more modern choice. setdefault
is still useful in older versions of Python (prior to 2.5).
Your question has already been answered, but IIRC you can replace lines like:
if d.has_key(scope_item):
with:
if scope_item in d:
That is, d
references d.keys()
in that construction. Sometimes defaultdict
isn't the best option (for example, if you want to execute multiple lines of code after the else
associated with the above if
), and I find the in
syntax easier to read.
Personally, I just use JSON to convert things to strings and back. Strings I understand.
import json
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
mydict = {}
hash = json.dumps(s)
mydict[hash] = "whatever"
print mydict
#{'[["yellow", 1], ["blue", 2], ["yellow", 3], ["blue", 4], ["red", 1]]': 'whatever'}
easy way is:
a = [1,2]
d = {}
for i in a:
d[i]=[i, ]
print(d)
{'1': [1, ], '2':[2, ]}
참고URL : https://stackoverflow.com/questions/960733/python-creating-a-dictionary-of-lists
'IT story' 카테고리의 다른 글
배열과 객체의 후행 쉼표가 사양의 일부입니까? (0) | 2020.05.06 |
---|---|
C #의 다중 상속 (0) | 2020.05.06 |
Python Pandas : 특정 값과 일치하는 열의 색인을 가져옵니다. (0) | 2020.05.06 |
크론과 virtualenv (0) | 2020.05.06 |
모든 개발자는 데이터베이스에 대해 무엇을 알아야합니까? (0) | 2020.05.06 |