所以,基本上我需要的是编写一个程序,用户键入一个整数列表,将它们存储在另一个列表中,其值仅为1-100,并显示结果列表。我的问题是我的程序不会删除我需要的所有值,并且我需要从1-100范围之外的列表中删除所有值。我的头衔没有任何借口,但我不知道怎么称呼这个问题。
def inputnumber():
numbers = input('Enter number(s): ').split(',')
return [int(i) for i in numbers]
x = inputnumber()
for i in x:
if i > 100 or i < 1:
x.remove(i)
y = list(set(x))
print(y)
我的意思是当我输入数字列表[5,-10,22,133,16,0,103,100,-60]时,我得到[16,100,5,22,103]的结果 - 103应该在那里。当我输入列表[5,-10,-15,-20,-60,103,108,10]时,我得到[-15,10,-60,5,108] - 我应该得到[10,5] ] 只要。也许我应该寻找其他功能,而不是&#39;&#39;删除&#39;&#39;或者有没有办法删除所有这些?
答案 0 :(得分:4)
更改:
y = list(set(x))
要:
y = list(set(filter(lambda e: 1 <= e <= 100, x)))
这使用过滤器在构造集合
之前过滤x或:
y = list(set([e for e in x if e in range(1, 101)]))
这使用列表推导来过滤您不感兴趣的值,并使用这些值构建set
。
答案 1 :(得分:2)
Python有一个名为filter
的内置函数可能有所帮助(编辑后包含@ ReutSharabani对lambda
定义的简写建议)。
x = inputnumber()
x = filter(lambda i: 1 <= i <=100, x)
y = list(set(x))
print(y)
答案 2 :(得分:0)
您可以使用列表理解。
x = [i for i in x if i > 1 and i < 100]
答案 3 :(得分:0)
当您通过删除for循环中的项目来迭代它时,您正在改变列表x
。这会导致您跳过列表中的跳过元素,例如103
。您可以迭代副本来修复此问题
for i in list(x): # iterates over a (shallow) copy
然而解决方案
y = list(set(e for e in x if e in range(1, 101)))
来自@ReutSharabani
可能是解决此问题的最佳方式。
答案 4 :(得分:0)
经过几个小时的阅读和尝试,我发现这个程序可以在不使用set的情况下制作。像这样,它给出了正确的顺序:
def inputnumber():
numbers = input('Enter number(s): ').split(',')
return [int(i) for i in numbers]
x = inputnumber()
y = [i for i in x if i>=1 and i<=100]
print(y)