从列表中删除值只留下唯一值

时间:2014-12-14 12:22:27

标签: python

所以,基本上我需要的是编写一个程序,用户键入一个整数列表,将它们存储在另一个列表中,其值仅为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;或者有没有办法删除所有这些?

5 个答案:

答案 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)