如何将多个列表元素相对于其位置进行比较



我有多个字符串列表。我需要将列表的每个位置的内容与其他列表中的同一位置进行比较。然后计算几个相同的数量(不包括" 0"(。列表的长度相同。这是一个示例:

list1 = ["a", "b", "c", "f", "0"]
list2 = ["a", "b", "e", "f", "0"]
list3 = ["a", "0", "c", "f", "0"]

因此,仅在所有列表上在同一位置上常见的"a""f"(" 0"不计数(,然后我需要等于2的输出。

我尝试了以下策略,但失败了,因为它仅比较两个乘以两个,并且可以修改np.sum,以便比较所有列表。

All_lists包含所有列表。

def scores(All_lists):
    score_lin = []
    score_ = 0
    for j in range(len(All_lists[0])):
        score_lin.append(
            np.sum(
                All_lists[j] == All_lists[j+1])
                - min(
                    np.count_nonzero(All_lists[j] == '0'),                 
                    np.count_nonzero(All_rg_lists[j+1] == '0')
                )
            )
    score_lin = [
        item 
        for item in score_lin 
        if item > 0
    ]
    score_ = sum(score_lin)
    return score_

编辑:有关列表的列表。

list_ = [
    [
        ["a", "b", "c", "f", 0], 
        ["a", "b", "e", "f", 0], 
        ["a", 0, "c", "f", 0]
    ], 
    [
        ["b", "x", "c", "f", 0],  
        ["a", "b", "c", "f", 0],  
        ["a", "b", "c", "f", 0]
    ],
]

考虑列表"列表"的列表。我需要将list[0][0] = ["a","b","c","f",0]list[1][0] = ["b","x","c","f",0]进行比较,并计算两个列表中类似元素的数量,然后在此示例中对list[0][1]list[1][1]...进行相同的操作。预期输出为8。

nb:列表的长度可能大于3。

您可以使用zip()一起将这3个列表汇递在一起,然后set()查找重复:

list1 = ["a", "b", "c", "f", "0"]
list2 = ["a", "b", "e", "f", "0"]
list3 = ["a", "0", "c", "f", "0"]
print(
    sum(
        len(set(i))==1 and i[0]!='0' 
        for i in zip(list1, list2, list3)
    )
)

打印:

2

编辑:对于列表中的列表:

l = [
    [
        ['s2', 's1', 's2', 's2', 's2', 's1', 0, 0, 0, 0],
        ['s2', 's1', 's2', 's2', 's2', 's1', 0, 0, 0, 0],
        ['s2', 's1', 's2', 's2', 's2', 's1', 0, 0, 0, 0],
        ['s2', 's1', 's2', 's2', 's2', 's1', 0, 0, 0, 0],
        ['s2', 's1', 's2', 's2', 's1', 0, 0, 0, 0, 0]
    ],
    [
        ['s2', 's1', 's1', 's3', 's3', 0, 0, 0, 0, 0],
        ['s2', 's1', 's1', 's3', 's3', 0, 0, 0, 0, 0],
        ['s2', 's1', 's1', 's3', 's3', 0, 0, 0, 0, 0],
        ['s2', 's1', 's1', 's3', 's3', 0, 0, 0, 0, 0],
        ['s2', 's1', 's3', 's3', 0, 0, 0, 0, 0, 0]
    ],
    [
        ['s2', 's1', 's2', 's2', 's2', 0, 0, 0, 0, 0],
        ['s2', 's1', 's2', 's2', 's2', 0, 0, 0, 0, 0],
        ['s2', 's1', 's2', 's2', 's2', 0, 0, 0, 0, 0],
        ['s2', 's1', 's2', 's2', 's2', 0, 0, 0, 0, 0],
        ['s2', 's1', 's2', 's2', 's3', 's3', 0, 0, 0, 0]
    ]
]
from pprint import pprint
total_sum = 0
for item in zip(*l):
    pprint(item)
    s = sum(
        len(set(i))==1 and i[0]!=0
        for i in zip(*item)
    )
    total_sum += s
    print(s)
    print('*' * 80)
print('Total sum =', total_sum)

打印:

(['s2', 's1', 's2', 's2', 's2', 's1', 0, 0, 0, 0],
 ['s2', 's1', 's1', 's3', 's3', 0, 0, 0, 0, 0],
 ['s2', 's1', 's2', 's2', 's2', 0, 0, 0, 0, 0])
2
********************************************************************************
(['s2', 's1', 's2', 's2', 's2', 's1', 0, 0, 0, 0],
 ['s2', 's1', 's1', 's3', 's3', 0, 0, 0, 0, 0],
 ['s2', 's1', 's2', 's2', 's2', 0, 0, 0, 0, 0])
2
********************************************************************************
(['s2', 's1', 's2', 's2', 's2', 's1', 0, 0, 0, 0],
 ['s2', 's1', 's1', 's3', 's3', 0, 0, 0, 0, 0],
 ['s2', 's1', 's2', 's2', 's2', 0, 0, 0, 0, 0])
2
********************************************************************************
(['s2', 's1', 's2', 's2', 's2', 's1', 0, 0, 0, 0],
 ['s2', 's1', 's1', 's3', 's3', 0, 0, 0, 0, 0],
 ['s2', 's1', 's2', 's2', 's2', 0, 0, 0, 0, 0])
2
********************************************************************************
(['s2', 's1', 's2', 's2', 's1', 0, 0, 0, 0, 0],
 ['s2', 's1', 's3', 's3', 0, 0, 0, 0, 0, 0],
 ['s2', 's1', 's2', 's2', 's3', 's3', 0, 0, 0, 0])
2
********************************************************************************
Total sum = 10

如果要接受任何数量列表的通用函数,则可以使用此列表,

def score(All_lists):
    z = zip(*All_lists) # zip lists together to make list of tuples
    z = [t for t in z if '0' not in t] # remove all '0' entries
    score_list = [1 for t in z if len(set(t))==1]
    return sum(score_list)

对于这些输入列表,

list1=["a","b","c","f","0"]
list2=["a","b","e","f","0"]
list3=["a","0","c","f","0"]
All_lists = [list1, list2, list3]

致电score(All_lists)返回2

您可以这样做:

list1=["a","b","c","f","0"]
list2=["a","b","e","f","0"]
list3=["a","0","c","f","0"]
print(len([len(set(x)) for x in list(zip(list1,list2,list3)) if len(set(x)) == 1 and x[0] != '0']))

输出:

 2

at:

sum(a == b == c  for a, b, c  in zip(list1, list2, list3) if a != '0')

最新更新