检测列表列表中某些索引中的重复值

时间:2016-02-10 20:02:33

标签: python list indexing

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

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"因为有一个" 2"在索引[1]的list1和" 2"的值中在list2中,索引为[1]。

我写这个函数的方式是

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'如果所有索引彼此相等,我只需要至少一个。而且我也不确定这种做法是否有效甚至是有效的。我不知道我是否会跳过步骤。

3 个答案:

答案 0 :(得分:4)

您可以使用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,则可能需要考虑使用izipfrom itertools import izip)而不是zip

答案 1 :(得分:1)

以下方法可行:

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

答案 2 :(得分:0)

以上答案很棒,并演示了如何使用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