2014-12-14 4 views
1

Итак, в основном мне нужно написать программу, в которой пользователь вводит список целых чисел, сохраняет их в другом списке со значениями только 1-100 и отображает результирующий список. Моя проблема в том, что моя программа удаляет не все значения, которые мне нужны, и мне нужно, чтобы все значения были удалены из списка вне диапазона 1-100. Theres не оправдывает мой титул, но я не уверен, как назвать эту проблему.Удалить значения из списка, оставляя только уникальные значения

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 ] только. Может быть, мне нужно искать какую-то другую функцию, а не «удалить», или есть способ удалить все из них?

ответ

4

Изменение:

y = list(set(x)) 

To:

y = list(set(filter(lambda e: 1 <= e <= 100, x))) 

Это использует фильтр для фильтрации х перед созданием множества

или:

y = list(set([e for e in x if e in range(1, 101)])) 

Это использует список понимание для фи введите значения, которые вам не интересны, и создайте set, используя эти значения.

+1

классный, спасибо! просто изменился на диапазон (1, 101), чтобы включить 100 –

+0

Отредактирован ответ. спасибо за исправление. –

+0

Интересно, кажется, что без установки он также работает хорошо, и это на самом деле даже лучше, поскольку дает результат не в случайной последовательности. –

2

Python имеет встроенную функцию, называемую filter, которая может помочь (отредактировано, чтобы включить стенографическое предложение @ ReutSharabani для определения lambda).

x = inputnumber() 
x = filter(lambda i: 1 <= i <=100, x) 
y = list(set(x)) 
print(y) 
+1

Вы можете заменить 'i> = 1 и i <= 100' на' 1 <= i <= 100' :) –

+0

Да, это правда. Спасибо @ReutSharabani! – rchang

0

Вы можете использовать список.

x = [i for i in x if i > 1 and i < 100] 
+0

OP хочет набор. Ваше решение будет включать дубликаты. –

0

Вы мутируют список 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

, вероятно, лучший способ подойти к этой проблеме.

0

После нескольких часов чтения и попыток выяснилось, что эта программа может быть выполнена без использования набора. Нравится это, и он дает правильную последовательность:

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) 
Смежные вопросы