我有两个或更多的列表。有点像这样:
listX = [('A', 1, 10), ('B', 2, 20), ('C', 3, 30), ('D', 4, 30)]
listY = [('a', 5, 50), ('b', 4, 40), ('c', 3, 30), ('d', 1, 20),
('A', 6, 60), ('D', 7, 70])
我想获得移动重复元素的结果,如下所示:
我的结果是从listX + listY获取所有列表,但是在重复的情况下
例如
listX的元素('A', 1, 10), ('D', 4, 30)
在listY中显示或退出。所以结果就像这样
result = [('A', 7, 70), ('B', 2, 20), ('C', 3, 30), ('D', 11, 100),
('a', 5, 50), ('b', 4, 40), ('c', 3, 30), ('d', 1, 20)]
(A, 7, 70)
是通过将('A', 1, 10)
和('A', '6', '60')
加在一起获得的
任何人都可以帮我解决这个问题。 感谢。
答案 0 :(得分:8)
如果你使用字典,这很容易。
combined = {}
for item in listX + listY:
key = item[0]
if key in combined:
combined[key][0] += item[1]
combined[key][1] += item[2]
else:
combined[key] = [item[1], item[2]]
result = [(key, value[0], value[1]) for key, value in combined.items()]
答案 1 :(得分:2)
您似乎正在使用类似字典的列表。您使用列表而不是词典的任何原因?
我对这个乱码问题的理解是,你想在元组中添加第一个元素的值。
我会做这样的事情:
counter = dict(
(a[0], (a[1], a[2]))
for a in listX
)
for key, v1, v2 in listY:
if key not in counter:
counter[key] = (0, 0)
counter[key][0] += v1
counter[key][1] += v2
result = [(key, value[0], value[1]) for key, value in counter.items()]
答案 2 :(得分:1)
我会说使用字典:
result = {}
for eachlist in (ListX, ListY,):
for item in eachlist:
if item[0] not in result:
result[item[0]] = item
如果您的数据结构不能很好地表示数据,那么执行数据操作总是很棘手。考虑使用更好的数据结构。
答案 3 :(得分:0)
使用字典及其“获取”方法。
d = {}
for x in (listX + listY):
y = d.get(x[0], (0, 0, 0))
d[x[0]] = (x[0], x[1] + y[1], x[2] + y[2])
d.values()