Вывести уникальные значения из списка те которые попадают в диапазон n<10000

Есть список от сортированный по убыванию, как сделать так чтобы в диапазон до 10000 влезли только уникальные элементы списка,пока сделал, что он дублирует значения, если циклом while...

n = 10000

lst = [5240, 2130, 1200, 1000, 820, 600, 500, 400, 300, 200, 100, 40, 20, 10]

for x in lst:
    while n>x:
        n-=x
        print(x, end = ' ')

выводит: 5240 2130 2130 400 40 40 10  
а надо чтобы выводил: 5240 2130 1200 1000 400 20 10

P.S. вот вроде так ну выводит все равно одинаковые.. 




Ответы (3 шт):

Автор решения: Alexey Sinitsky

Вот как-то так получилось, видимо, не все гладко, ну соображал сам местами, подсмотрел только, как сортировать словарь по значению:

# вводим килограммы:
n = int(input())*1000

print(n)

things = {'карандаш': 20, 'зеркальце': 100, 'зонт': 500, 'рубашка': 300,
          'брюки': 1000, 'бумага': 200, 'молоток': 600, 'пила': 400, 'удочка': 1200,
          'расческа': 40, 'котелок': 820, 'палатка': 5240, 'брезент': 2130, 'спички': 10}

# тут подсмотрел как отсортировать словарь по убыванию значений,
# чтобы выводились ключи также по убыванию:
sorted_things = {keys:things[keys] for keys in sorted(things ,key=things.get, reverse=True)}

print(sorted_things)
#
# делаем значения:
lst = things.values()

# сортируем:
lst = sorted(lst)

# сортируем по убыванию:
lst = lst[::-1]
print(lst)

#
# #lst = [5240, 2130, 1200, 1000, 820, 600, 500, 400, 300, 200, 100, 40, 20, 10]
#
arr = []

# делаем список значений, которые отсортированы по убыванию:
for x in lst:
    if n>=x:
        n-=x
        #print(x, end = ' ')
        arr.append(x)

print(arr)
#
# выводим словарь из списка значений:
out = [key for key, value in sorted_things.items() if value in arr]
#
# распаковываем его в строчку:
print(*out)
→ Ссылка
Автор решения: Fox Fox

Есть список:

lst = [5240, 2130, 1200, 1000, 820, 600, 500, 400, 300, 200, 100, 40, 20, 10]

В этом списке УЖЕ уникальные значения! И все они меньше 10000! Вот код, который исполняет буквально то, что Вы заказали:

n = 10000
lst = [5240, 2130, 2130, 1200, 1000, 820, 600, 500, 400, 300, 200, 100, 40, 20, 10]
print(*sorted(set(filter(lambda x: x < 10000, lst)), reverse=True))

Вот результат:

5240 2130 1200 1000 820 600 500 400 300 200 100 40 20 10

Если бы в исходном списке были дубли, они были бы убраны.

→ Ссылка
Автор решения: Stanislav Volodarskiy

Задачу в вопросе надо формулировать полностью:

things = {'карандаш': 20, 'зеркальце': 100, 'зонт': 500, 'рубашка': 300,
          'брюки': 1000, 'бумага': 200, 'молоток': 600, 'пила': 400, 'удочка': 1200,
          'расческа': 40, 'котелок': 820, 'палатка': 5240, 'брезент': 2130, 'спички': 10}

lst = sorted(((v, k) for k, v in things.items()), reverse=True)

n = int(input()) * 1000
for w, t in lst:
    if n >= w:
        n -= w
        print(t, end=' ')
print()
$ echo 10 | python rucksack.py
палатка брезент удочка брюки пила карандаш спички
→ Ссылка