【问题标题】:Merge tuple with multiple item python将元组与多个项目python合并
【发布时间】:2019-01-22 13:29:30
【问题描述】:

我需要我的脚本来合并具有多个项目的元组。我有:

list = [('France', 'Euro', 'Paris'), ('France', 'Euro', 'Marseille'), 
('Allemagne', 'Euro', 'Berlin'),
('Allemagne', 'Euro', 'Hambourg'), ('Allemagne', 'Euro', 'Munich'),
('France', 'Euro', 'Lyon'), ('Turquie', 'Livre', 'Ankara')]

我想要:

list = [('France', 'Euro', 'Paris', 'Marseille', 'Lyon'), 
('Allemagne', 'Euro', 'Berlin', 'Hambourg', 'Munich'),
('Turquie', 'Livre', 'Ankara')]

我找到了:

for t in j:
    d.setdefault(t[0], set()).add(t[1])
result = tuple(tuple([k]+list(v)) for k, v in d.items())

但我只能在每行有 2 个项目时合并项目。

我尝试过修改逻辑但没有成功。

【问题讨论】:

  • 解释要合并哪些元组,在什么基础上以及如何合并。你的例子不清楚。
  • 是否总是元组中的前两项相同,而第三项发生变化?
  • 请不要覆盖list
  • 元组中的前两项始终相同
  • 欢迎来到 StackOverflow。请按照您创建此帐户时的建议阅读并遵循帮助文档中的发布指南。 On topichow to ask... the perfect question 在此处申请。

标签: python python-3.x list merge concatenation


【解决方案1】:

您的代码存在多个问题:

  1. 您希望按国家和货币进行分组。然而,您的字典只使用 Country 键。
  2. 您的元组推导式只会返回一个元组,而您需要一个元组列表作为输出。
  3. 您正在遮蔽内置的 list 类,千万不要这样做。

您可以将 collections.defaultdict 与元组键一起使用,然后使用列表推导:

from collections import defaultdict

d = defaultdict(list)

for ctry, ccy, city in L:
    d[(ctry, ccy)].append(city)

res = [k+tuple(v) for k, v in d.items()]

print(res)

[('France', 'Euro', 'Paris', 'Marseille', 'Lyon'),
 ('Allemagne', 'Euro', 'Berlin', 'Hambourg', 'Munich'),
 ('Turquie', 'Livre', 'Ankara')]

【讨论】:

  • 为什么将元组转换为列表并返回元组? [k+tuple(v) for k, v in d.items()]
  • @tobias_k,谢谢,这是一个公平的观点,我忘了你可以添加元组(当然,效率低下)。
【解决方案2】:

在我看来,您想遍历列表,并组合每个包含相同 secondsecond 元组的 third 元素(作为货币) em>第一个元素

这就是我将如何进行:

currencies = {}
for i in lists:
    if (i[0],i[1]) in currencies.keys():
        currencies[(i[0],i[1])] = currencies[(i[0],i[1])]|set([i[2]])
    else:
        currencies[(i[0],i[1])] = set([i[2]])
lists = []
for c in currencies:
    lists.append(list(c) + list(currencies[c]))
print(lists)

这将产生: [['France', 'Euro', 'Marseille', 'Lyon', 'Paris'], ['Allemagne', 'Euro', 'Berlin', 'Munich', 'Hambourg'], ['Turquie', 'Livre', 'Ankara']] 虽然结果不是列表中的元组,但它仍然对数据进行排序,希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多