繁体   English   中英

Python:转换字典中的元组列表

[英]Python: transform list of tuples in dictionary

想知道是否有更惯用的(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) ...] }

这是我的代码。 目前,它正在运行,但是我不确定这是否是最高效/最高效的方法。

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

谢谢!

我会使用collections.defaultdict

def preparer_donnees(data):
    from collections import defaultdict

    ret = defaultdict(list)

    for v in data:
        ret[v[0]].append(v[1:])

    return ret

您可以使用嵌套列表理解:

{line[0] : [tup[1:] for tup in data if tup[0] == line[0]] for line in data}

如果所有元组都包含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)]

您可以使用字典的“ setdefault”方法(在许多情况下可以使用defaultdict代替它-但并非总是如此-我喜欢setdefault,因为它更通用且功能更强大)

'setdefault'dict方法的用例

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}

是错误的,因为他的字典的值是列表列表而不是值列表。 我没有足够的声誉来评论(新帐户),因此请在此处添加此观察结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM