#python #list
Вопрос:
Поэтому я запрограммировал этот код, чтобы распечатать, сколько раз число будет напечатано в списке, который я предоставил, и результат работает, но я хочу поместить все значения, которые я получаю, в список, как я могу это сделать? Это мой код…
i = [5,5,7,9,9,9,9,9,8,8]
def num_list(i):
return [(i.count(x),x) for x in set(i)]
for tv in num_list(i):
if tv[1] > 1:
print(tv)
Результат, который я получаю, таков
(2, 8)
(5, 9)
(2, 5)
(1, 7)
но я хочу, чтобы результат был таким
[2,8,5,9,2,5,1,7)
Как я могу это сделать??
Комментарии:
1. Ммммм, не пользуйся
[(i.count(x),x) for x in set(i)]
. Это потенциально очень неэффективно. используйтеcollections.Counter
2. как вы получаете этот заказ? почему бы (1,7) не прийти раньше (2,5) ? если уж на то пошло, почему бы и нет
[(2,5),(1,7),(5,9) ,(2,8)]
…. может быть, порядок не имеет значения?3. Обратите внимание, что пользователи StackOverflow любят видеть код в вопросах. Кроме того, в своем описании вы ссылаетесь на код, который невидим после вашего редактирования. Пожалуйста, не меняйте вопросы таким образом, чтобы на них нельзя было ответить, даже после того, как вы получили ответы. Например, ваше заявление о желаемом результате и результат, который вы получаете, очень важны для ответа на вопрос. Поэтому я отменяю явно случайное удаление кода и соответствующей информации.
Ответ №1:
Просто сделай:
tvlist = []
for tv in num_list(i):
if tv[1] > 1:
tvlist.extend(tv)
print(tvlist)
Или понимание списка:
tvlist = [x for tv in num_list(i) if tv[1] > 1 for x in tv]
Кроме того, ваша функция может быть просто collections.Counter
:
from collections import Counter
def num_list(i):
return Counter(i).items()
Ответ №2:
flattened_iter = itertools.chain.from_iterable(num_list(i))
print(list(flattened_iter))
это то, как я бы сгладил список
как упоминали все остальные коллекции.Счетчик, вероятно, будет значительно более производительным для больших списков…
если вы предпочитаете реализовать это самостоятельно, вы можете довольно легко
def myCounter(a_list):
counter = {}
for item in a_list:
# in modern python versions order is preserved in dicts
counter[item] = counter.get(item,0) 1
for unique_item in counter:
# make it a generator just for ease
# we will just yield twice to create a flat list
yield counter[unique_item]
yield unique_item
i = [5,5,7,9,9,9,9,9,8,8]
print(list(myCounter(i)))
Ответ №3:
Использование a collections.Counter
более эффективно. Это в сочетании с itertools.chain
даст вам желаемый результат:
from collections import Counter
from itertools import chain
i = [5,5,7,9,9,9,9,9,8,8]
r = list(chain(*((v, k) for k, v in Counter(i).items() if v > 1)))
print(r)
[2, 5, 5, 9, 2, 8]
Без itertools.chain
r = []
for k, v in Counter(i).items():
if v > 1:
r.extend((v, k))