2017-07-08 48 views
0

我有一个列表,我以下述方式填充:检查如果一个列表的元素的一部分被重复

complete = [] 
for (i,j) in list: 
    complete.append('%s %s %s'%(i,j,R[i,j])) 

列表具有(作为一个例子)以下元素:

complete = ['B A 1', 'A H 1', 'P B 1', 'H B 1', 'B W 1', 'B M 9', 'M R 9', 'R P 9', 'P A 9', 'C S 7', 'B C 7', 'B A 7', 'A H 7', 'B P 7', 'M B 7', 'P B 7', 'H B 7'] 

我想检查哪些字母重复,并在这种情况下添加相应的数字。 在这个例子中,(B A)与1和7重复,所以其中一个输出必须是'B A 8'。

我也可以改变我追加元素的方式来完成,但我不知道其他方式如何。

谢谢!

回答

2

你可以试试这个:

from collections import Counter, defaultdict 
complete = ['ASO BAIS 1', 'HEL CIO 5'] 

d = Counter([i[:-1] for i in complete]) 

new_d = defaultdict(int) 

for i in complete: 
    if d[i[:-1]] > 0: 
    new_d[i[:-1]] += int(i[-1]) 

print(dict(new_d)) 
#maximum value: 
maximum = max(new_d.values()) 
print(maximum) 

输出:

{'HEL CIO ': 5, 'ASO BAIS ': 1} 
+0

不错!谢谢。如果列表不是'A B 1''H C 5'......而是'ASO BAIS 1''HEL CIO 5'?而不是随机大小的字母单词? –

+0

@IgnacioGarcia请看我最近的编辑。我只是改变了列表切片的索引,以创建一个更强大的解决方案,它将适用于您指定的输入。 – Ajax1234

+0

非常感谢!最后,我怎样才能获得这个new_d的最大值?例如max(new_d)= 5。 –

0

这可以通过两个步骤非常简单地完成:

  1. 首先,获得独特的字母列表在你的列表中配对。这将用于制作字典。
  2. 接下来,遍历列表中的每个元素,并使用当前字母对索引字典。通过将元素中的最后一个字符转换为整数来增加字典中字母对的键值对。

>>> lst = ['B A 1', 'A H 1', 'P B 1', 'H B 1', 'B W 1', 'B M 9', 'M R 9', 'R P 9', 'P A 9', 'C S 7', 'B C 7', 'B A 7', 'A H 7', 'B P 7', 'M B 7', 'P B 7', 'H B 7'] 
>>> keys = set(key[:3] for key in lst) 
>>> 
>>> new_dict = {key: 0 for key in keys} 
>>> for el in lst: 
...  new_dict[el[:3]] += int(el[4]) 
... 
>>> new_dict 
{'B C': 7, 'H B': 8, 'R P': 9, 'B A': 8, 'B P': 7, 'B M': 9, 'P A': 9, 'A H': 8, 'C S': 7, 'M B': 7, 'M R': 9, 'P B': 8, 'B W': 1} 
>>> 
+0

谢谢@Christian Dean。我现在怎么能获得这个new_dict的最大值?例如max(new_dict)= 9 –

+0

@IgnacioGarcia您可以获得字典值的最大值:'max(new_dict.values())'。 –

相关问题