У меня есть два списка:
list_1 = [1,1, 2,2,2, 3,3, 4, 4, 4 ,4, 4, 5,5,5,5]
list_2 = [5, 5, 5, 6, 6, 7]
Я хочу вернуть список элементов, которые появляются только в первом списке, но не во втором, и список должен быть отсортирован по возрастанию, чтобы результат был таким:
[1, 3, 2, 4]
Пока у меня это:
def sorted_nums(list_1,list2_2):
c = (set(list_1) - set(list_2))
d = dict.fromkeys(c, 0)
for index in list_1:
if index in c:
d[index]+=1
return d
a = sorted_nums(list_1,list_2)
b = sorted(a.items(), key = lambda x: x[1])
print(b)
и он возвращает это:
[(1,2), (3,2), (2,3), (4,5)]
Не могли бы вы помочь мне изменить последнюю часть кода, чтобы я получил желаемый результат?
Отредактируйте свой вопрос, указав сортировку по частоте возникновения.
Ни один из элементов первого списка не появляется во втором списке, и список уже упорядочен по возрастанию. Можете ли вы уточнить вопрос и вывод?
Используя sorted(array, key = list_1.count)
для сортировки по вхождению, но это будет медленно.
list_1 = [1,1, 2,2,2, 3,3, 4, 4, 4 ,4, 4, 5,5,5,5]
list_2 = [5, 5, 5, 6, 6, 7]
def sorted_nums(list_1,list2_2):
return sorted(list(set(list_1) - set(list_2)), key = list_1.count)
sorted_nums(list_1, list_2)
С помощью Counter
. Это более быстрый подход. :
from collections import Counter
list_1 = [1,1, 2,2,2, 3,3, 4, 4, 4 ,4, 4, 5,5,5,5]
list_2 = [5, 5, 5, 6, 6, 7]
counter_1 = Counter(list1)
def sorted_nums(list_1,list2_2):
return sorted(counter_1.keys() - set(list2), key=counter_1.get)
sorted_nums(list_1, list_2)
Выход:
[1, 3, 2, 4]
использовать set
операции
a = [1,1, 2,2,2, 3,3, 4, 4, 4 ,4, 4, 5,5,5,5]
b = [5, 5, 5, 6, 6, 7]
c = sorted(list(set(a) - set(b)))
print(c)
Спасибо, но мне нужен результат [1, 3, 2, 4]. Итак, из этих двух списков мне нужно создать третий, и он будет отсортирован по количеству вхождений в первом
list(dict.fromkeys(list_1))
работает так же, как set
, но сохраняет порядок элементов
def sorted_nums(list_1,list_2):
return tuple(filter(lambda x: x not in set(list_2), list(dict.fromkeys(list_1))))
Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, редактировать добавьте дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.
Все, что вам нужно, это map
def sorted_nums(list_1,list2_2):
c = (set(list_1) - set(list_2))
d = dict.fromkeys(c, 0)
for index in list_1:
if index in c:
d[index]+=1
return d
list_1 = [1,1, 2,2,2, 3,3, 4, 4, 4 ,4, 4, 5,5,5,5]
list_2 = [5, 5, 5, 6, 6, 7]
a = sorted_nums(list_1,list_2)
b = list(map(lambda x:x[0],sorted(a.items(), key = lambda x: x[1]))) ## changed here
print(b)
[1, 3, 2, 4]
Примените функцию lambda x:x[0]
к каждому элементу, используя map
Вы уже разобрались. Итак, вам нужно извлечь первый элемент?
print([x[0] for x in b])
Строка должна быть добавлена сразу после всех строк.
Вы можете сделать это с помощью встроенных в Python функций манипулирования:
def sorted_nums(list_1,list_2):
diff = set(list_1).difference(set(list_2))
occurrences = {i: list_1.count(i) for i in diff}.items()
return [elems[0] for elems in sorted(occurrences, key = lambda pair: pair[1])]
Выход:
[1, 3, 2, 4]
Это определенно неэффективный, квадратичное время, когда это можно сделать за линейное время. Счетный код OP был эффективным
Вы просто хотите отсортировать по вхождению (количеству) lis1, взяв разность наборов из второго списка:
>>> list1 = [1,1, 2,2,2, 3,3, 4, 4, 4 ,4, 4, 5,5,5,5]
>>> list2 = [5, 5, 5, 6, 6, 7]
>>> from collections import Counter
>>> counts1 = Counter(list1)
>>> sorted(counts1.keys() - set(list2), key=counts1.get)
[1, 3, 2, 4]
Если вы согласны с порядком по умолчанию для связанных подсчетов, это довольно кратко:
from collections import Counter
list_1 = [1,1, 2,2,2, 3,3, 4, 4, 4 ,4, 4, 5,5,5,5]
list_2 = [5, 5, 5, 6, 6, 7]
blacklist = set(list_2)
c = Counter(i for i in list_1 if i not in blacklist)
[n for n,_ in reversed(c.most_common())]
Результат равен [3, 1, 2, 4]
(обратите внимание, что количество для 1 и 3 одинаково).
Если вы можете полагаться на то, что порядок вашего list_1 будет таким же, как в вашем примере (все кластеры последовательные), вы можете сделать немного лучше, используя itertools.groupby
:
import itertools.groupby
c = sorted((len(list(g)), i) for i, g in itertools.groupby(list_1) if i not in blacklist)
[i for _, i in c]
Выход [1, 3, 2, 4]
Моя интерпретация вопроса приводит меня к следующему:
list_1 = [1,1, 2,2,2, 3,3, 4, 4, 4 ,4, 4, 5,5,5,5]
list_2 = [5, 5, 5, 6, 6, 7]
d = dict()
list_2_s = set(list_2)
for e in list_1:
if e not in list_2_s:
d[e] = d.setdefault(e, 0) + 1
lst = [t[1] for t in sorted((v, k) for k, v in d.items())]
print(lst)
Выход:
[1, 3, 2, 4]
Как
[1, 3, 2, 4]
в порядке возрастания? Вы имеете в виду[1,2,3,4]
?