【问题标题】:Summarize the second elements in list of tuples if first elements are the same? [duplicate]如果第一个元素相同,则总结元组列表中的第二个元素? [复制]
【发布时间】:2019-01-03 09:21:23
【问题描述】:

如何总结元组列表中的第二个元素, 如果第一个元素相同?

例如:

在这个

lst = [('milk', '2.35'), ('bread', '1.95'), ('chips', '2.54'), 
       ('milk', '2.38'), ('milk', '2.31'), ('bread', '1.90')]

我会一起总结牛奶的第二种成分, 一起总结面包的第二个元素。

并返回此列表:

[('bread', '3.85'), ('chips', '2.54'), ('milk', '7.04')]

def my_def(a):
    my_list = []
    for item in a:
        if item[0] not in my_list:
            my_list.append(item[0])
    return my_list

我可以找到相同的:(

【问题讨论】:

  • 使用itertools.groupby()。但首先,将类似数字的字符串转换为数字。
  • @DYZ 他们不需要 groupby,他们已经有了分组逻辑并且匹配的元素在源列表中实际上并不连续。
  • @jonrsharpe 使用现有函数几乎总是优于自定义逻辑。自然是先排序再分组。
  • Groupby 适用于排序列表:您可以按lst = sorted( (k,float(v)) for k,v in [('milk', '2.35'), ('bread', '1.95'), ('chips', '2.54'), ('milk', '2.38'), ('milk', '2.31'), ('bread', '1.90')]) 排序(并转换为浮点数)

标签: python python-3.x python-2.7 tuples summary


【解决方案1】:

您可以用 collections.defaultdict() 的浮点数进行总结:

from collections import defaultdict

l = [('milk', '2.35'), ('bread', '1.95'), ('chips', '2.54'), ('milk', '2.38'), ('milk', '2.31'), ('bread', '1.90')]

d = defaultdict(float)
for x, y in l:
    d[x] += float(y)

print([(x, round(y, 2)) for x, y in d.items()])
# [('milk', 7.04), ('bread', 3.85), ('chips', 2.54)]

【讨论】:

  • 不错的一个 - 可能比其中一个更好。
  • @PatrickArtner 谢谢,我在骗局结束时回答了这个问题,我的错。不过,我觉得stackoverflow.com/questions/39734549/sum-numbers-by-letter-in-list-of-tuples 更像是一个骗局。
  • 我不介意回答下面的骗子.. 有一个宽限期,如果你想测试模组的“愤怒”,你可以使用开发者工具欺骗客户端评估。我加了你的骗子..这个问题至少有 10 到 15 个......这很常见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
相关资源
最近更新 更多