【问题标题】:rebuild python array based on common elements基于公共元素重建python数组
【发布时间】:2015-12-29 11:27:32
【问题描述】:

我正在尝试创建一个字典列表,将给定数据集中的常见值分组。数据格式如下

data = [{"CustName":"customer1", "PartNum":"part1"},
{"CustName":"customer2", "PartNum":"part2"}, 
{"CustName":"customer1", "PartNum":"part3"}, 
{"CustName":"customer2", "PartNum":"part4"}]

我想要的是

cleanedData = [
{"CustName":"customer1", "parts":[{"PartNum":"part1"}, {"PartNum":"part3"}]},
{"CustName":"customer2", "parts":[{"PartNum":"part2"}, {"PartNum":"part4"}]}]

我试图开始工作的方式需要几个循环,看起来很丑,而且感觉不是很pythonic。我也觉得这不会很好地扩展。目前,输入数据很小 - 少于 100 个元素,但可能有数千个元素,因此循环中的多个循环似乎效率低下。

data = [{"CustName":"customer1", "PartNum":"part1"},
{"CustName":"customer2", "PartNum":"part2"}, 
{"CustName":"customer1", "PartNum":"part3"}, 
{"CustName":"customer2", "PartNum":"part4"}]

customers = []
cleanedData = []
for d in data:
    if d["CustName"] not in customers:
        customers.append(d["CustName"])

for c in customers:
    parts = []
    for d in data:
        if d["CustCode"] == c:
            parts.append(d)
    cust = {"CustName":c}
    cust.update({"parts":parts})
    cleanedData.append(cust)

有人可以提供帮助并提供一种更简单的方法吗?是否有内置函数可以帮助进行这种数据操作?

【问题讨论】:

  • 我知道这不是您想要的,但是{'customer1': ['part1', 'part3'], 'customer2': ['part2', 'part4']} 的答案可以接受吗?还是您需要所需的确切数据?
  • 我需要程序其他部分的键值对。下面的解决方案正是通过列表推导实现的。

标签: python


【解决方案1】:

您可以使用collections.defaultdict

d = defaultdict(list)
for item in data:
    d[item['CustName']].append({'PartNum': item['PartNum']})
print(d)

如果您希望它在列表中,还可以选择遵循列表理解:

print([{'CustName': key, 'parts': value} for key, value in d.items()])    

【讨论】:

  • 太棒了!工作完美。需要确保你导入from collections import defaultdict
猜你喜欢
  • 1970-01-01
  • 2016-04-07
  • 2020-12-14
  • 2018-03-06
  • 2015-02-12
  • 2013-08-07
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
相关资源
最近更新 更多