Получить разницу между двумя списками

Поздний ответ, но для записи (для всех, кто приходит на эту страницу): вам нужно использовать аргумент «keyf» вместо «key», так как ваш ключ на самом деле будет функцией дата события (т. е. «день», извлеченный с даты), а не сама дата. Это должно делать то, что вы ищете:

db.coll.group(
{
    keyf: function(doc) {
        var date = new Date(doc.date);
        var dateKey = (date.getMonth()+1)+"/"+date.getDate()+"/"+date.getFullYear()+'';
        return {'day':dateKey};
    },
    cond: {topic:"abc"},
    initial: {count:0},
    reduce: function(obj, prev) {prev.count++;}
});

. Для получения дополнительной информации взгляните на страницу документа MongoDB по агрегации и группе: http://www.mongodb.org/display / DOCS / Aggregation # Aggregation-группа

678
задан denfromufa 29 April 2017 в 13:12
поделиться

6 ответов

In [5]: list(set(temp1) - set(temp2))
Out[5]: ['Four', 'Three']

Помните, что

In [5]: set([1, 2]) - set([2, 3])
Out[5]: set([1]) 

там, где вы могли ожидать / хотите, чтобы он был равен set ([1, 3]) . Если вы хотите, чтобы в качестве ответа set ([1, 3]) , вам нужно было использовать set ([1, 2]). Simric_difference (set ([2, 3]) ) .

1106
ответ дан 22 November 2019 в 21:30
поделиться
def diffList(list1, list2):     # returns the difference between two lists.
    if len(list1) > len(list2):
        return (list(set(list1) - set(list2)))
    else:
        return (list(set(list2) - set(list1)))

, например, если list1 = [10, 15, 20, 25, 30, 35, 40] и list2 = [25, 40, 35] затем возвращенный список будет output = [10, 20, 30, 15]

0
ответ дан 22 November 2019 в 21:30
поделиться

Попробуйте это:

temp3 = set(temp1) - set(temp2)
9
ответ дан 22 November 2019 в 21:30
поделиться
temp3 = [item for item in temp1 if item not in temp2]
74
ответ дан 22 November 2019 в 21:30
поделиться

Все существующие решения предлагают либо одно, либо другое:

  • Быстрее, чем O(n*m) производительность.
  • Сохранение порядка входного списка.

Но до сих пор ни одно решение не обладает обоими. Если вам нужно и то, и другое, попробуйте следующее:

s = set(temp2)
temp3 = [x for x in temp1 if x not in s]

Тест производительности

import timeit
init = 'temp1 = list(range(100)); temp2 = [i * 2 for i in range(50)]'
print timeit.timeit('list(set(temp1) - set(temp2))', init, number = 100000)
print timeit.timeit('s = set(temp2);[x for x in temp1 if x not in s]', init, number = 100000)
print timeit.timeit('[item for item in temp1 if item not in temp2]', init, number = 100000)

Результаты:

4.34620224079 # ars' answer
4.2770634955  # This answer
30.7715615392 # matt b's answer

Представленный мной метод, как и сохранение порядка, также (немного) быстрее, чем вычитание множества, поскольку не требует построения ненужного множества. Разница в производительности будет более заметна, если первый список будет значительно длиннее второго и если хэширование будет дорогим. Вот второй тест, демонстрирующий это:

init = '''
temp1 = [str(i) for i in range(100000)]
temp2 = [str(i * 2) for i in range(50)]
'''

Результаты:

11.3836875916 # ars' answer
3.63890368748 # this answer (3 times faster!)
37.7445402279 # matt b's answer
450
ответ дан 22 November 2019 в 21:30
поделиться

я добавлю, поскольку ни одно из существующих решений не дает кортежа:

temp3 = tuple(set(temp1) - set(temp2))

альтернатива:

#edited using @Mark Byers idea. If you accept this one as answer, just accept his instead.
temp3 = tuple(x for x in temp1 if x not in set(temp2))

Как и другие ответы в этом направлении, не дающие кортежей, он сохраняет порядок

13
ответ дан 22 November 2019 в 21:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: