List Python:在列表中,将具有相同字符串名称的元组计数相加

List Python:在列表中,将具有相同字符串名称的元组计数相加,list,python-3.5,List,Python 3.5,在我下面的列表L中,如何将“alex”加在一起,因此19+12=21是alex的计数 对于mike,如何添加以从这2个元组生成单个(mike,30)元组 ('mike / 213880_at', 15), ('mike / 210393_at', 15), marko也一样:如何从列表中的以下元组中获取(marko,24): ('marko / 229481_at', 12), ('marko / 1553115_at', 12), L = [ ('alex / 222696_at'

在我下面的列表L中,如何将“alex”加在一起,因此19+12=21是alex的计数

对于mike,如何添加以从这2个元组生成单个(mike,30)元组

('mike / 213880_at', 15),
('mike / 210393_at', 15),
marko也一样:如何从列表中的以下元组中获取(marko,24):

('marko / 229481_at', 12),
('marko / 1553115_at', 12),

L = [
    ('alex / 222696_at', 19),
    ('mike / 213880_at', 15),
    ('mike / 210393_at', 15),
    ('NOTUM / 228649_at', 13),
    ('marko / 229481_at', 12),
    ('marko / 1553115_at', 12),
    ('alex / 224176_s_at', 12),
    ('pocke / 227812_at', 11),
    ('locke / A_23_P111995', 10),
    ('nicko / 225016_at', 10),
    ('kolya / A_23_P122216', 10),
    ('raj / 211518_s_at', 9),
    ('dave / 240211_at', 8)
]

您可以这样做:

L = [
    ('alex / 222696_at', 19),
    ('mike / 213880_at', 15),
    ('mike / 210393_at', 15),
    ('NOTUM / 228649_at', 13),
    ('marko / 229481_at', 12),
    ('marko / 1553115_at', 12),
    ('alex / 224176_s_at', 12),
    ('pocke / 227812_at', 11),
    ('locke / A_23_P111995', 10),
    ('nicko / 225016_at', 10),
    ('kolya / A_23_P122216', 10),
    ('raj / 211518_s_at', 9),
    ('dave / 240211_at', 8)
]
new = {}
for name, number in L:
    val = name.split(' / ')[0]
    if val in new:
        new[val] += number
    else:
        new[val]= number
print(new)
输出:

{'alex': 31, 'mike': 30, 'NOTUM': 13, 'marko': 24, 'pocke': 11, 'locke': 10, 'nicko': 10, 'kolya': 10, 'raj': 9, 'dave': 8}
如果要返回元组中:

#add this
new = tuple([(x, new[x]) for x in new])

如果您想保留列表顺序并进行O(1)查找

from collections import OrderedDict

def add_pairs(sequence):
    container = OrderedDict()
    for tag, value in sequence:
        key = tag.split()[0]
        container[key] = container.get(key, 0) + value
    return container
示例:

>>> L = [
('alex / 222696_at', 19),
('mike / 213880_at', 15),
('mike / 210393_at', 15),
('NOTUM / 228649_at', 13),
('marko / 229481_at', 12),
('marko / 1553115_at', 12),
('alex / 224176_s_at', 12),
('pocke / 227812_at', 11),
('locke / A_23_P111995', 10),
('nicko / 225016_at', 10),
('kolya / A_23_P122216', 10),
('raj / 211518_s_at', 9),
('dave / 240211_at', 8)
]
>>> add_pairs(L)
OrderedDict([('alex', 31), ('mike', 30), ('NOTUM', 13), ('marko', 24), ('pocke', 11), ('locke', 10), ('nicko', 10), ('kolya', 10), ('raj', 9), ('dave', 8)])

/
和下面的数字/代码是怎么回事?@Alexander我正在研究生物数据。不幸的是,数据就是这样给出的。基因的名称,然后是它的探针号。“alex/222696_在‘我不关心探针编号,只关心基因名称及其在我的基因数据集中的频率。因此,为了简化这个问题,首先引入一个步骤,将输入数据处理为一个单独的名称和探针编号。是的@Alexander,我将使用更多的预处理。str.split()非常方便。谢谢@abccd你知道dict.most_common()可以应用于这个元组“new”的函数?我不太明白你的意思是什么?
dict
没有一个最常见的态度,一个
集合。Counter
有一个用于查找最常见值的方法