【问题标题】:Detecting duplicate values in certain indexes in a list of lists检测列表列表中某些索引中的重复值
【发布时间】:2016-02-10 20:02:32
【问题描述】:

我正在使用列表列表(类似于拼图)并尝试编写一个函数,如果在与另一个列表相同的索引中至少有一个重复值(可以视为列),该函数将返回“False” , 视觉上)(否则为真)。例如:

List = [[ 1,  2,  3,  4,  5],
          [ 6,  7,  8,  9, 10],
          [11, 12, 13, 14, 15],
          [16, 17, 18, 19, 20],
          [21, 22, 23, 24, 25]]

应该返回 'True' 因为没有重复 但是:

List = [[ 1,  2,  3,  4,  5],
          [ 6,  2,  8,  9, 10],
          [11, 12, 13, 14, 15],
          [16, 17, 18, 19, 20],
          [21, 22, 23, 24, 25]]

应该返回“False”,因为在 index[1] 的 list1 中有一个值为“2”,而在 index[1] 的 list2 中有一个值为“2”。

我写函数的方式如下

def check_columns_valid(list):

  for i in range(len(list)):
     if i[0] == i[5]  == i[10] ==  i[15] == i[20]:
        return False
     elif i[1] == i[6] == i[11] == i[16] == i[21]:
        return False
     elif i[2] == i[7] == i[12] == i[17] == i[22]:
        return False
     elif i[3] == i[8] == i[13] == i[18] == i[23]:
        return False
     elif i[4] == i[9] == i[14] == i[19] == i[24]:
        return False
   return True

我试图检查某些索引是否彼此相等,但如果所有索引彼此相等并且我只需要至少一个,我的代码可能只会返回“False”。而且我也不确定这种做法是否有效。我不知道我是否跳过步骤。

【问题讨论】:

  • 你测试了吗?使用一些示例数据进行尝试。找到一个特定的问题将有助于人们调试它。
  • 当你写 i[0] == i[5] == i[10] == i[15] == i[20] 这意味着它们都相等。如果你写 i[0] == i[5] 或 i[0] == i[10] 或 ... 你会得到你想要的,但有更好的方法来解决这个问题。

标签: python list indexing


【解决方案1】:

您可以使用zip 并设置来帮助解决此问题。

def check_columns_valid(puzzle):
    # Iterate over the puzzle one column at a time.
    for column in zip(*puzzle):
        # Get all of the unique values in the column.
        uniques = set(column)
        if len(uniques) != len(column):
            # If the number of unique values isn't the same as the
            # number of values, return False.
            return False

    return True

或者,如果你是单线的粉丝,所有这些都可以简化为:

def check_columns_valid(puzzle):
    return all(len(x) == len(set(x)) for x in zip(*puzzle))

根据puzzle 的大小,如果您使用的是Python 2.x,您可能需要考虑使用izip (from itertools import izip) 而不是zip

【讨论】:

    【解决方案2】:

    以下方法可行:

    puzzle = [[ 1,  2,  3,  4,  5],
          [ 6,  2,  8,  9, 10],
          [11, 12, 13, 14, 15],
          [16, 17, 18, 19, 20],
          [21, 22, 23, 24, 25]]
    
    print sum(len(set(x)) for x in zip(*puzzle)) < 25
    

    这将显示True

    这是通过获取行列表并使用zip(*puzzle) 将其转换为列列表来实现的。从这里它从每一列创建一个集合。如果集合的大小小于 5,则两个项目必须相同。因此,当您有 5 x 5 时,如果总数小于 25,则项目必须在某处匹配。


    作为一个函数:

    def check_columns_valid(puzzle):
        return sum(len(set(x)) for x in zip(*puzzle)) < 25
    

    【讨论】:

      【解决方案3】:

      上面的答案很好,并演示了如何使用 Python 的大型内置函数库来发挥自己的优势。代码越少越好!

      但是,如果您想看到一个“艰难”的答案,出于教育目的:

      def check_columns_valid(puzzle):
          # check each item against later items in the same column
          for row in range(0, len(puzzle)):
              for column in range(0, len(puzzle[0])):
                  if puzzle[row][column] in [puzzle[r][column] for r in range(row+1, 5)]:
                      return False
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-20
        • 1970-01-01
        • 1970-01-01
        • 2016-03-12
        • 2017-08-22
        • 1970-01-01
        相关资源
        最近更新 更多