有点像python的新手,我在解决这个问题时遇到了麻烦。
假设我有一个列表A并假设我想返回一个包含至少三个最小值的列表B,包括重复值。我该如何为此编写逻辑?关于如何将这种思想转化为代码,我感到有些失落。
示例:
A = [1,2,3,4,4]
b = [1,2,3]
A = [1,2,3,3,4]
B = [1,2,3,3]
A = [1,1,2,2,3]
B = [1,1,2,2]
A = [1,1,2,3]
B = [1,1,2]
答案 0 :(得分:2)
您可以使用heapq
模块:
import heapq
def nsmallestwithrepeats(A, n=3):
b = heapq.nsmallest(n, A)
try:
b = set(b)
except TypeError:
pass
return [a for a in A if a in b]
for A in [1,2,3,4,4], [1,2,3,3,4], [1,1,2,2,3], [1,1,2,3]:
print(nsmallestwithrepeats(A))
输出:
[1, 2, 3]
[1, 2, 3, 3]
[1, 1, 2, 2]
[1, 1, 2]
正如@MathieuBandleé指出的那样,而不是形成一个集合,简单地比较b的最大元素可能更有效:
def nsmallestwithrepeats(A, n=3):
b = heapq.nsmallest(n, A)
return [a for a in A if a <= b[-1]]
答案 1 :(得分:2)
我们可以使用set
获取不同的值,然后保持最小值3。
然后我们只保留A中属于这3个值的值。
def smallest_3_with_repeats(A):
smallest_distinct = sorted(list(set(A)))[:3]
return [x for x in sorted(A) if x in smallest_distinct]
for A in [[1,2,3,4,4], [1,2,3,3,4], [1,1,2,2,3],
[1,1,2,3],[1, 1, 1, 2, 3, 4] ] :
print(A, "-->", smallest_3_with_repeats(A))
#[1, 2, 3, 4, 4] --> [1, 2, 3]
#[1, 2, 3, 3, 4] --> [1, 2, 3, 3]
#[1, 1, 2, 2, 3] --> [1, 1, 2, 2, 3]
#[1, 1, 2, 3] --> [1, 1, 2, 3]
#[1, 1, 1, 2, 3, 4] --> [1, 1, 1, 2, 3]
编辑:正如Paul Pantzer所说,这不是OP所要求的。 我们希望结果中至少有3个值,但不一定都是3个不同的最小值。
所以,一个符合标准的版本:
def smallest_3_with_repeats(A):
smallest_distinct = sorted(list(set(A)))[:3]
smallest = []
for val in smallest_distinct:
smallest.extend([x for x in A if x == val])
if len(smallest) >= 3:
break
return smallest
for A in [[1,2,3,4,4], [1,2,3,3,4], [1,1,2,2,3],
[1,1,2,3],[1, 1, 1, 2, 3, 4] ] :
print(A, "-->", smallest_3_with_repeats(A))
# [1, 2, 3, 4, 4] --> [1, 2, 3]
# [1, 2, 3, 3, 4] --> [1, 2, 3, 3]
# [1, 1, 2, 2, 3] --> [1, 1, 2, 2]
# [1, 1, 2, 3] --> [1, 1, 2]
# [1, 1, 1, 2, 3, 4] --> [1, 1, 1]
答案 2 :(得分:0)
我个人这样做:
def get_mins(my_list, how_many):
sorted_list = sorted(my_list)
return [i for i in sorted_list if i != sorted_list[-1]][:how_many]
if __name__ == '__main__':
print(get_mins([1, 2, 3, 4, 4], 3))
print(get_mins([1, 2, 3, 3, 4], 4))
print(get_mins([1, 1, 2, 2, 3], 4))
print(get_mins([1, 1, 2, 3], 3))
print(get_mins([1, 1, 1, 2, 3, 4], 4))
输出将是:
[1, 2, 3] [1, 2, 3, 3] [1, 1, 2, 2] [1, 1, 2] [1, 1, 1, 2]
没什么好看的,也不需要额外的模块。
该函数有两个参数:
该函数使用list comprehension并将所有与最大值不同的值添加到新列表中(在我们的例子中,是sorted_list
的最后一个元素)。
答案 3 :(得分:0)
没有多少经验的python ...但这似乎工作.. 如果A []未排序,您也可以使用排序(A)
A = [1,1,2,2,2,3]
B = []
count = 0
i = 0
while count<3 or A[i] == A[i-1]:
B.append(A[i])
i = i+1
count = count + 1
print B