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。
任何人都知道如何编写算法...被卡住了。
谢谢。
您可以分三步完成:
- 迭代嵌套列表并从单元素列表中提取所有数字,如
[5]
- 将嵌套列表展平为数字列表
- 迭代扁平化列表,直到找到有效数字
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]
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。
任何人都知道如何编写算法...被卡住了。
谢谢。
您可以分三步完成:
- 迭代嵌套列表并从单元素列表中提取所有数字,如
[5]
- 将嵌套列表展平为数字列表
- 迭代扁平化列表,直到找到有效数字
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]