将相同字典键的值放在 python 的一组中
Putting values of same dictionary keys in one group in python
我有两个列表:
list1=[0,0,0,1,1,2,2,3,3,4,4,5,5,5]
list2=['a','b','c','d','e','f','k','o','n','q','t','z','w','l']
dictionary=dict(zip(list1,list2))
我想为每个键输出相同键的值,例如它会像这样打印:
0 ['a','b','c']
1 ['d','e']
2 ['f','k']
3 ['o','n']
4 ['q','t']
5 ['z','w','l']
我写了下面的代码来做到这一点,但它并没有像我想的那样工作
for k,v in dictionary.items():
print (k,v)
你能告诉我如何修改代码以便我能得到超出预期的结果吗?
提前致谢!
您显示的代码与您描述的完全不同。
除此之外,您可以先压缩列表,然后使用 collections.defaultdict
:
对同一键的值进行分组,从而将同一键的值组合在一起
from collections import defaultdict
d = defaultdict(list)
for k, v in zip(list1, list2):
d[k].append(v)
print(d)
# defaultdict(<type 'list'>, {0: ['a', 'b', 'c'], 1: ['d', 'e'], 2: ['f', 'k'], 3: ['o', 'n'], 4: ['q', 't'], 5: ['z', 'w', 'l']})
关于您的代码:
dictionary = dict(zip(list1, list2))
创建字典:
{0: 'c', 1: 'e', 2: 'k', 3: 'n', 4: 't', 5: 'l'}
这会丢失每组中除最后一个值以外的所有值。您需要处理压缩列表以构建分组数据。两种方法是 itertools.groupby()
或 defaultdict(list)
,此处显示。
使用 collections.defaultdict
of lists to group the items with keys from list1
and values from list2
. Pair the items from each list with zip()
:
from collections import defaultdict
list1=[0,0,0,1,1,2,2,3,3,4,4,5,5,5]
list2=['a','b','c','d','e','f','k','o','n','q','t','z','w','l']
d = defaultdict(list)
for k,v in zip(list1, list2):
d[k].append(v)
for k in sorted(d):
print('{} {!r}'.format(k, d[k]))
输出:
0 ['a', 'b', 'c']
1 ['d', 'e']
2 ['f', 'k']
3 ['o', 'n']
4 ['q', 't']
5 ['z', 'w', 'l']
由于字典中的项目是无序的,因此输出是按键排序的。
您可以使用 itertool.groupby
作为简洁的单行解决方案:
import itertools
list1=[0,0,0,1,1,2,2,3,3,4,4,5,5,5]
list2=['a','b','c','d','e','f','k','o','n','q','t','z','w','l']
final_list = {a:[i[-1] for i in list(b)] for a, b in itertools.groupby(zip(list1, list2), key=lambda x: x[0])}
for a, b in final_list.items():
print(a, b)
输出:
0 ['a', 'b', 'c']
1 ['d', 'e']
2 ['f', 'k']
3 ['o', 'n']
4 ['q', 't']
5 ['z', 'w', 'l']
我有两个列表:
list1=[0,0,0,1,1,2,2,3,3,4,4,5,5,5]
list2=['a','b','c','d','e','f','k','o','n','q','t','z','w','l']
dictionary=dict(zip(list1,list2))
我想为每个键输出相同键的值,例如它会像这样打印:
0 ['a','b','c']
1 ['d','e']
2 ['f','k']
3 ['o','n']
4 ['q','t']
5 ['z','w','l']
我写了下面的代码来做到这一点,但它并没有像我想的那样工作
for k,v in dictionary.items():
print (k,v)
你能告诉我如何修改代码以便我能得到超出预期的结果吗? 提前致谢!
您显示的代码与您描述的完全不同。
除此之外,您可以先压缩列表,然后使用 collections.defaultdict
:
from collections import defaultdict
d = defaultdict(list)
for k, v in zip(list1, list2):
d[k].append(v)
print(d)
# defaultdict(<type 'list'>, {0: ['a', 'b', 'c'], 1: ['d', 'e'], 2: ['f', 'k'], 3: ['o', 'n'], 4: ['q', 't'], 5: ['z', 'w', 'l']})
关于您的代码:
dictionary = dict(zip(list1, list2))
创建字典:
{0: 'c', 1: 'e', 2: 'k', 3: 'n', 4: 't', 5: 'l'}
这会丢失每组中除最后一个值以外的所有值。您需要处理压缩列表以构建分组数据。两种方法是 itertools.groupby()
或 defaultdict(list)
,此处显示。
使用 collections.defaultdict
of lists to group the items with keys from list1
and values from list2
. Pair the items from each list with zip()
:
from collections import defaultdict
list1=[0,0,0,1,1,2,2,3,3,4,4,5,5,5]
list2=['a','b','c','d','e','f','k','o','n','q','t','z','w','l']
d = defaultdict(list)
for k,v in zip(list1, list2):
d[k].append(v)
for k in sorted(d):
print('{} {!r}'.format(k, d[k]))
输出:
0 ['a', 'b', 'c'] 1 ['d', 'e'] 2 ['f', 'k'] 3 ['o', 'n'] 4 ['q', 't'] 5 ['z', 'w', 'l']
由于字典中的项目是无序的,因此输出是按键排序的。
您可以使用 itertool.groupby
作为简洁的单行解决方案:
import itertools
list1=[0,0,0,1,1,2,2,3,3,4,4,5,5,5]
list2=['a','b','c','d','e','f','k','o','n','q','t','z','w','l']
final_list = {a:[i[-1] for i in list(b)] for a, b in itertools.groupby(zip(list1, list2), key=lambda x: x[0])}
for a, b in final_list.items():
print(a, b)
输出:
0 ['a', 'b', 'c']
1 ['d', 'e']
2 ['f', 'k']
3 ['o', 'n']
4 ['q', 't']
5 ['z', 'w', 'l']