在列表的列表中减去两个值

subtracting two values inside a list of list

my_list = [['chr1', 65419, 65433], ['chr1', 65520, 65573], ['chr1', 69037, 71585], ['chr1', 69055, 70108], ['chr1', 137621, 139379],['chr2', 65419, 65433], ['chr2', 65520, 65573], ['chr2', 69037, 71585], ['chr3', 69055, 70108]]

在列表中,将有字符串 'chr1'、'chr2'、'chr3'。我想减去每个字符串的索引 2-1 的值,并得到 'chr1'、'chr2'、'chr3'

的总值

例子 在前两个字符串中 (65433 - 65419) 应该被减去,这应该被添加到 (65573-65520) 中,因为它们都包含 'chr1'。所有列表都应该发生这种情况,最终结果应如下所示 'chr1' 总计 = x_value, 'chr2' 总计 = y_value, 'chr3' 总计 = x_value

我有点新 python.can 有人为此建议了一个代码。

my_list = [['chr1', 65419, 65433], ['chr1', 65520, 65573], ['chr1', 69037, 71585], ['chr1', 69055, 70108], ['chr1', 137621, 139379],['chr2', 65419, 65433], ['chr2', 65520, 65573], ['chr2', 69037, 71585], ['chr3', 69055, 70108]]
mylist1=list()
mylist2=list()
mylist3=list()

for i in my_list:
    if i[0]=='chr1':
        mylist1.append(i[2]-i[1])
    elif i[0]=='chr2':
        mylist2.append(i[2]-i[1])
    elif i[0]=='chr3':
        mylist3.append(i[2]-i[1])

print("chr1:",sum(mylist1))
print("chr2:",sum(mylist2))
print("chr3:",sum(mylist3))

sum 已经是要使用的预定义函数。

现在如果你有更多的字符:

my_list = [['chr1', 65419, 65433], ['chr1', 65520, 65573], ['chr1', 69037, 71585], ['chr1', 69055, 70108], ['chr1', 137621, 139379],['chr2', 65419, 65433], ['chr2', 65520, 65573], ['chr2', 69037, 71585], ['chr3', 69055, 70108]]
chrset=set()
for i in my_list:
    chrset.add(i[0])

res = dict.fromkeys(chrset, 0)

for i in my_list:
    res[i[0]]=res[i[0]]+i[2]-i[1]
print(res)

对于python的新手来说更容易,只需制作一组chr1,chr2,....然后创建一个字典并直接对其进行操作。

对于大型列表,您可以这样做(没有硬编码字符串匹配):

from itertools import groupby

my_list = [['chr1', 65419, 65433], ['chr1', 65520, 65573], ['chr1', 69037, 71585], ['chr1', 69055, 70108], ['chr1', 137621, 139379],['chr2', 65419, 65433], ['chr2', 65520, 65573], ['chr2', 69037, 71585], ['chr3', 69055, 70108]]

f = lambda x: x[0]
for k, g in groupby(sorted(my_list, key=f), key=f):
    print(k, sum(x[2] - x[1] for x in g))

# chr1 5426
# chr2 2615
# chr3 1053
from collections import defaultdict
my_list = [['chr1', 65419, 65433], ['chr1', 65520, 65573], ['chr1', 69037, 71585], ['chr1', 69055, 70108], ['chr1', 137621, 139379],['chr2', 65419, 65433], ['chr2', 65520, 65573], ['chr2', 69037, 71585], ['chr3', 69055, 70108]]
result = defaultdict(int)
temp = [{i[0]:i[2]-i[1]} for i in my_list]
for di in temp:
    result [ list(di.keys())[0] ] += list(di.values())[0]
for i,v in result.items():
    print(f"{i} total = {v}")

您可以使用字典来保存键值对,并在您有更多具有相同键的列表时更新它们。

my_dict=dict()
for entry in my_list:
    if entry[0] in my_dict:
        my_dict[entry[0]]+=entry[2]-entry[1]
     else:
         my_dict [entry[0]]=entry[2]-entry[1]

这适用于您拥有的任何键(不限于示例中的三个键)