如何比较具有相同字母表的两个列表列表并获取最大数量并将它们附加到另一个列表?

时间:2017-10-04 09:36:32

标签: python list

我得到了这两个清单:

A=[[12, 'a'], [0, 'c'], [2, 'w'], [3, 'Q'], [0, 'a'], [0, 'c'], [0, 'w'], [5, 'Q']]
B=[[12, 'a'], [0, 'c'], [15, 'w'], [3, 'Q']]

我希望按字母表比较这两个列表,并将带有最大数字的列表附加到新列表C?

C=[[12, 'a'], [0, 'c'], [15, 'w'], [3, 'Q'],[12, 'a'], [0, 'c'], [15, 'w'], [5, 'Q']]
编辑:我收到了这段代码,但只输出

C=[[12, 'a'], [0, 'c'], [15, 'w'], [3, 'Q']]?

C = []
for g1, g2 in zip(a,b):
    line = []
    for e1, e2 in zip(g1, g2):
        line.append(max(e1, e2))
    C.append(line)

2 个答案:

答案 0 :(得分:1)

首先创建一个包含B中最大值的字典,注意确保处理列表中任何可能的重复项。然后根据C中找到的最大值和当前值,使用列表推导创建B

A = [[12, 'a'], [0, 'c'], [2, 'w'], [3, 'Q'], [0, 'a'], [0, 'c'], [0, 'w'], [5, 'Q']]
B = [[12, 'a'], [0, 'c'], [15, 'w'], [3, 'Q']]

max_values = {}

for count, value in B:
    try:
        max_values[value] = max(max_values[value], count)
    except KeyError:
        max_values[value] = count

C = [[max(count, max_values[value]), value] for count, value in A]

print C

给你:

[[12, 'a'], [0, 'c'], [15, 'w'], [3, 'Q'], [12, 'a'], [0, 'c'], [15, 'w'], [5, 'Q']]

在您提供的示例中,B包含唯一值,但如果同一个字母恰好有多个条目,则此解决方案将确保使用最大值。

答案 1 :(得分:0)

zip在这种情况下不起作用,因为B的元素可以在C中的任何位置使用。 zip返回的可迭代只有最短列表的元素数。

您需要在A中保留C的订单,因此A应该保留一个列表,但B应该是一个字典:

>>> A=[[12, 'a'], [0, 'c'], [2, 'w'], [3, 'Q'], [0, 'a'], [0, 'c'], [0, 'w'], [5, 'Q']]
>>> B=[[12, 'a'], [0, 'c'], [15, 'w'], [3, 'Q']]
>>> B = {l[1]:l for l in B}
>>> B
{'a': [12, 'a'], 'c': [0, 'c'], 'w': [15, 'w'], 'Q': [3, 'Q']}

然后,您可以使用列表推导来获取最大值:

>>> [max(l, B[l[1]]) for l in A]
[[12, 'a'], [0, 'c'], [15, 'w'], [3, 'Q'], [12, 'a'], [0, 'c'], [15, 'w'], [5, 'Q']]