Python-сравните и отсортируйте два списка чисел и верните их в порядке возрастания

У меня есть два списка:

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)]

Не могли бы вы помочь мне изменить последнюю часть кода, чтобы я получил желаемый результат?

Как [1, 3, 2, 4] в порядке возрастания? Вы имеете в виду [1,2,3,4]?

Abhyuday Vaish 09.04.2022 11:46

Отредактируйте свой вопрос, указав сортировку по частоте возникновения.

Abhyuday Vaish 09.04.2022 11:50

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

Tomerikoo 09.04.2022 15:02
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
3
58
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Способ 1:

Используя 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)

Способ 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]. Итак, из этих двух списков мне нужно создать третий, и он будет отсортирован по количеству вхождений в первом

jamiek 09.04.2022 11:48

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

Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, редактировать добавьте дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.

Community 09.04.2022 11:58
Ответ принят как подходящий

Все, что вам нужно, это 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])

Строка должна быть добавлена ​​сразу после всех строк.

Fong Sow Leong 09.04.2022 12:12

Вы можете сделать это с помощью встроенных в 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 был эффективным

juanpa.arrivillaga 09.04.2022 11:55

Вы просто хотите отсортировать по вхождению (количеству) 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]

Другие вопросы по теме