Python - сгладить список списков в уникальные значения?

У меня есть список списков в python:

content = {88962: [80, 130], 87484: [64], 53662: [58,80]}

Я хочу превратить его в список уникальных значений

[58,64,80,130]

Я написал ручное решение, но это ручное решение. Я знаю, что есть более сжатый и более элегантный способ сделать это со списком, отображением/уменьшением, itertools и т.д. У кого есть подсказка?

content = {88962: [80, 130], 87484: [64], 53662: [58,80]}
result = set({})
for k in content.keys() :
    for i in content[k]:
        result.add(i)
# and list/sort/print just to compare the output
r2 = list( result )
r2.sort()
print r2

Ответ 1

Двойное задание набора:

sorted({x for v in content.itervalues() for x in v})

Ответ 2

В python3.7 вы можете использовать комбинацию .values и chain.

from itertools import chain
sorted(set(chain(*content.values())))
# [58, 64, 80, 130]

# another option is 'itertools.groupby'
from itertools import groupby
[k for k, g in groupby(sorted(chain(*content.values())))]

В python2.7

from itertools import chain
sorted(set(chain.from_iterable(content.itervalues())))
# [58, 64, 80, 130]

# another option is 'itertools.groupby'
[k for k, g in groupby(sorted(chain.from_iterable(content.itervalues())))]

Ответ 3

используйте set() и itertools.chain():

In [83]: content = {88962: [80, 130], 87484: [64], 53662: [58,80]}

In [84]: from itertools import chain

In [94]: x=set(chain(*content.values()))

In [95]: x
Out[95]: set([58, 64, 80, 130]) # a set, the items may or may not be sorted

In [96]: sorted(x)         #convert set to a sorted list
Out[96]: [58, 64, 80, 130]

Ответ 4

sorted(set(val
            for row in content.itervalues()
                for val in row))

set получает все различные значения (например, словарь, но без накладных расходов на сохранение значений). sorted затем просто берет созданный set и возвращает a list, отсортированный в порядке возрастания.

Ответ 5

list(reduce(lambda a, b: a.union(set(b)), content.itervalues(), set()))

lambda превращает два входных аргумента в группы и объединяет их.

reduce сделает левую складку над перечнем, который ему передается, - в этом случае списки, которые являются значения ваших словарей.

reduce вернет результат этого, который является set обратно в список.

Это также можно записать:

list(reduce(lambda a, b: a | set(b), content.itervalues(), set()))

Ответ 6

sorted(set(sum(content.values(), [])))

Ответ 7

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

Python 3:

sorted(list(set([val for vals in content.values() for val in vals])))

Python 2.7:

sorted(list(set([val for vals in content.itervalues() for val in vals])))