繁体   English   中英

使用正确的索引比较列表中的条目

[英]Comparing between entries in a list of lists using correct indexes

我有一个列表列表,我正在尝试将内部列表中的条目与其他条目进行比较。 例如:列表是my_list = [[4,6,4,3], [4,5,5,3], [4,1,1,3]]我希望得到的输出是[4,'x','x',3]也就是说,如果内部列表中i索引中的条目在所有内部列表中都相同,则返回该条目,否则返回'x'
我的代码中的索引有问题,因为对于循环的i=2轮,我得到了rows[4][j]并且这超出了索引。 我通常不确定这里的外循环或如何修复条件中的索引。

def my_function(my_list):
    lst = []
    for i, entry in enumerate(my_list):
        for j, elem in enumerate(entry):
            if my_list[i][j] == my_list[i+1][j] and my_list[i+1][j] == my_list[i+2][j]:
                lst.append(my_lists[i][j])
            else:
                lst.append('x')
    return lst

您应该尽可能避免操作索引。 要迭代多个列表,请使用zip

要测试列表中的所有值是否相等,您可以创建一个set ,并检查它是否只包含一个值。

my_list = [[4,6,4,3], [4,5,5,3], [4,1,1,3]]
out = [zipped[0] if len(set(zipped)) == 1 else 'X' for zipped in zip(*my_list)]
print(out)
# [4, 'X', 'X', 3]

为此,您可以使用numpy + list comprehension:

import numpy as np

my_list = np.array([[4,6,4,3], [4,5,5,3], [4,1,1,3]])

res=['x' if (len(set(my_list[:,i]))>1) else list(set(my_list[:,i]))[0] for i in range(my_list.shape[1])]

输出:

[4, 'x', 'x', 3]

并修复您的代码(我不确定您的if语句是什么意思)

def my_function(my_list):
    lst = my_list[0]
    for i, entry in enumerate(my_list):
        for j, elem in enumerate(entry):
            if my_list[i][j]==lst[j]:
                lst[j]=my_list[i][j]
            else:
                lst[j]='x'
    return lst

您可以使用这个简单的 python 代码。

my_list = [[4,6,4,3], [4,5,5,3], [4,1,1,3]]
li = []
for i, j, k in zip(*my_list):
    val = i if i == j == k else 'x'
    li.append(val)
print(li)

输出 :

[4, 'x', 'x', 3]

您还可以使用 all 来检查这一点:

[i[0] if all(j == i[0] for j in i) else 'X' for i in(zip(*my_list))]

或者:

[i[0] if all(map(lambda j: j == i[0], i )) else 'X' for i in(zip(*my_list))]

您还可以扩展项目以查看:

[i[0] if [i[0]]*len(i) == list(i) else 'X' for i in(zip(*my_list))]

但我认为最好的方法是使用set

[i[0] if len(set(i))==1 else 'X' for i in(zip(*my_list))] 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM