【问题标题】:Comparing between entries in a list of lists using correct indexes使用正确索引比较列表列表中的条目
【发布时间】:2020-02-10 04:38:06
【问题描述】:

我有一个列表列表,我正在尝试将内部列表中的条目与其他条目进行比较。 例如:列表是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

【问题讨论】:

    标签: python python-3.x list


    【解决方案1】:

    您应该尽可能避免操纵索引。要迭代多个列表,请使用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]
    

    【讨论】:

      【解决方案2】:

      您可以为此目的使用numpy + 列表推导:

      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
      

      【讨论】:

      • 我实际上不允许使用任何模块:np、itertools、re 等:/
      • 我也为你的函数添加了修复;)
      【解决方案3】:

      你可以使用这个简单的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]
      

      【讨论】:

      • 如果 'my_list' 有 n 个内部列表怎么办?
      【解决方案4】:

      你也可以使用 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))] 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多