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

时间:2018-04-16 13:56:50

标签: python algorithm list select rule

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

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

规则:

1)所有列表都按降序排列(从左到右),因此我们始终选择较早的子列表中的数字(在本例中为[2, 3]

2)如果有多个号码(无法确定),我们会继续往下走,直到该号码出现在下面最早的子列表中。在A的情况下,[1]都不包含2或3,而最后一项[3]包含3,我们认为A中的最佳数字是3。 / p>

我会更多地举例说明。

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。

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

感谢。

2 个答案:

答案 0 :(得分:1)

您可以分三步完成:

  1. 迭代嵌套列表并从单个元素列表中提取所有数字,例如[5]
  2. 将嵌套列表展平为数字列表
  3. 迭代展平列表,直至找到有效数字
  4. 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
    

答案 1 :(得分:0)

Aran-Fey的答案不适用于输入[[],[3,6],[3,5],[6],[1]],最佳选择是3,他的答案返回6 ... 这是一个适用于所有情况的函数,如果无法选择将它们分开,则返回遇到的所有第一个候选列表。

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]