想知道是否有一种更惯用(pythonic)的方法。我有一个由游标对象返回的元组列表,我正在尝试重新组合字典中的数据。我得到的数据格式如下:
[("Département d'informatique", 119, 74, 193),
("Département d'informatique", 193, 67, 260),
("Département de chimie", 355, 44, 399) ... ]
请注意部门重复。具有相同部门的每一行代表不同类型的数据。我需要在包含密钥(部门名称)的字典中重新组合该数据,并且该值将是将该部门作为其第一个成员的所有元组的列表。所以像这样:
{ "Département d'informatique": [(119, 74, 193), (193,67,260) ...] }
这是我的代码。它现在正在工作,但我不确定它是否是最有效/ pythonic的做事方式。
def preparer_donnees(data):
ret = { ligne[0] : [] for ligne in data }
for ligne in data:
for entree in ligne[1:]:
ret[ligne[0]].append(entree)
return ret
谢谢!
答案 0 :(得分:4)
def preparer_donnees(data):
from collections import defaultdict
ret = defaultdict(list)
for v in data:
ret[v[0]].append(v[1:])
return ret
答案 1 :(得分:0)
您可以使用嵌套列表理解:
{line[0] : [tup[1:] for tup in data if tup[0] == line[0]] for line in data}
答案 2 :(得分:0)
如果所有元组都有4个元素,你可以解压缩元组:
my_d = {}
for k, v1, v2, v3 in l:
if my_d.get(k):
my_d[k] += [(v1,v2,v3)]
else:
my_d[k] = [(v1,v2, v3)]
答案 3 :(得分:0)
你可以使用字典" setdefault"方法(在很多情况下可以使用defaultdict替换 - 但并非总是如此 - 我喜欢setdefault,因为它更通用且非常强大)
Use cases for the 'setdefault' dict method
def process( data ):
result = {}
for vals in data:
result.setdefault( vals[0], [] ).append( vals[1:] )
return result
另外,mathsaey的回答
{line[0] : [tup[1:] for tup in data if tup[0] == line[0]] for line in data}
是错误的,因为他的字典的值是列表而不是值列表。我没有足够的声誉来评论(新帐户),所以在这里添加这个观察。