Python 推导出列表列表中的最佳数字

Python deduce best number among list of lists

 A= [[], [2, 3], [1], [1], [3]]

我有一个列表列表。我想要做的是在列表中确定一个最佳数字(代表一个选择)。 --- 这样做的通用算法

规则:

1) 所有的列表都是降序排列的(从左到右),所以我们总是选择前面的子列表中的数字(在本例中是[2, 3] )

2) 如果有多个号码(不能确定),我们一直往下走,直到号码出现在后面最早的子列表中。在 A 的情况下, [1] 都不包含 2 或 3,并且由于最后一项 [3] 包含 3,我们决定 A 中的最佳数字是 3.

为了更清楚,我都举更多的例子。

B=[[5], [0, 8], [0, 8], [0, 8], [1]]

最好的数字是 5。

C=[[0, 1], [0, 3], [0], [0], [2]]  

最好的数字是 0。

D=[[], [3, 6], [3, 5, 6], [6], [1]]

最好的数字是 6。

任何人都知道如何编写算法...被卡住了。

谢谢。

您可以分三步完成:

  1. 迭代嵌套列表并从单元素列表中提取所有数字,如 [5]
  2. 将嵌套列表展平为数字列表
  3. 迭代扁平化列表,直到找到有效数字
def find_best(choices):
    # make a set of valid output numbers
    valid_numbers = {sublist[0] for sublist in choices if len(sublist) == 1}

    # flatten the nested input list
    flat_list = (number for sublist in choices for number in sublist)

    # find the first number that's a valid output
    return next(number for number in flat_list if number in valid_numbers)

print(find_best([[], [2, 3], [1], [1], [3]]))  # 3
print(find_best([[5], [0, 8], [0, 8], [0, 8], [1]]))  # 5
print(find_best([[0, 1], [0, 3], [0], [0], [2]]))  # 0
print(find_best([[], [3, 6], [3, 5, 6], [6], [1]]))  # 6

这是一个适用于所有情况的函数,return如果无法选择将它们分开,则列出所有遇到的第一个候选对象。

def find_best(list_of_lists):
    i = 0
    while len(list_of_lists[i]) == 0:
        i+=1
    list_containing_candidates = list_of_lists[i][:]
    if len(list_containing_candidates) == 1 :
        return list_containing_candidates[0]
    else:
        if i+1 < len(list_of_lists):
            for next_list in list_of_lists[i+1:]:                
                for candidate in list_containing_candidates[:]:
                    if candidate not in next_list:                        
                        list_containing_candidates.remove(candidate)
                if len(list_containing_candidates) == 0:
                    list_containing_candidates = list_of_lists[i][:]
                elif len(list_containing_candidates) == 1:
                    return list_containing_candidates[0]
        return list_of_lists[i] # ambigous case, entire list of candidates returned



print(find_best([[], [2, 3], [1], [1], [3]]))  # 3
print(find_best([[5], [0, 8], [0, 8], [0, 8], [1]]))  # 5
print(find_best([[0, 1], [0, 3], [0], [0], [2]]))  # 0
print(find_best([[], [3, 6], [3, 5, 6], [6], [1]]))  # 6
print(find_best([[], [3, 6], [3, 5], [6], [1]]))  # 3
print(find_best([[1,3 ], [1, 3], [1,2,3], [1,3], []]))  # [1,3]