所以我有这个工作代码,但问题是,它没有按照我喜欢的方式工作。有人知道吗?
import time
numlist1 =[[1],[2],[3]]
def listdecrement():
minVal=numlist1.index(min(numlist1)) # getting minimum value by index position
minVal_add = minVal+1
if minVal < minVal_add:
numlist1[minVal].clear() # deleting value in index with minimum value
time.sleep(0.2)
print("updating")
print(numlist1)
while True:
listdecrement()
输出:
[[], [2], [3]]
updating
[[], [2], [3]]
updating
[[], [2], [3]]
期望输出:
[[], [2], [3]]
updating
[[], [], [3]]
updating
[[], [], []]
您可以首先将列表[[],[2],[3]]
展平为[2, 3]
,然后找到最小值2
,然后将其作为列表[2]
:进行搜索
import time
numlist1 =[[1],[2],[3]]
def listdecrement():
flat_list = [item for sublist in numlist1 for item in sublist]
minVal=numlist1.index([min(flat_list)]) # getting minimum value by index position
minVal_add = minVal+1
if minVal < minVal_add:
numlist1[minVal].clear() # deleting value in index with minimum value
time.sleep(0.2)
print("updating")
print(numlist1)
while True:
try:
listdecrement()
except ValueError:
break
输出
updating
[[], [2], [3]]
updating
[[], [], [3]]
updating
[[], [], []]
问题是min
函数在包含空列表的列表上,它返回空列表作为索引,因为min
实际上是0
,这是最小的元素,因此您一直试图更改相同的索引,以使其清晰可见:
list_to_check = [[],[2],[3]]
min_index =list_to_check.index(min(list_to_check))
print(min_index)
# returns 0
要修复它,你必须检查min
的合法元素(这意味着不是空的(,就像在这个修改的解决方案中一样:
import time
numlist1 =[[1],[2],[3]]
def listdecrement():
if (len([item for item in numlist1 if len(item)])>0):
minVal=numlist1.index(min(item for item in numlist1 if len(item)>0)) # getting minimum value by index position
else:
return
minVal_add = minVal+1
if minVal < minVal_add:
numlist1[minVal].clear() # deleting value in index with minimum value
time.sleep(0.2)
print("updating")
print(numlist1)
while True:
listdecrement()
输出:
updating
[[], [2], [3]]
updating
[[], [], [3]]
updating
[[], [], []]
修复
- 由于每个项都是一个单元素数组,因此给min一个键,使其可以处理[]
- 检查列表中的所有项目是否为空以防止无限循环
代码
import time
import sys
numlist1 =[[1],[2],[3]]
def listdecrement():
# add key to min so we compare item in list i.e. for
# for [2] => key function returns 2,
# for [] => key function return sys.maxsize (max integer)
minVal=numlist1.index(min(numlist1, key = lambda v: v[0] if v else sys.maxsize)) # getting minimum value by index position
minVal_add = minVal+1
if minVal < minVal_add:
numlist1[minVal].clear() # deleting value in index with minimum value
time.sleep(0.2)
print("updating")
print(numlist1)
while any(x for x in numlist1): # True if any elements
# are not [] in numlist1
listdecrement()
输出
updating
[[], [2], [3]]
updating
[[], [], [3]]
updating
[[], [], []]