Ответ 1
Двойное задание набора:
sorted({x for v in content.itervalues() for x in v})
У меня есть список списков в 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
Двойное задание набора:
sorted({x for v in content.itervalues() for x in v})
В 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())))]
используйте 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]
sorted(set(val
for row in content.itervalues()
for val in row))
set
получает все различные значения (например, словарь, но без накладных расходов на сохранение значений). sorted
затем просто берет созданный set
и возвращает a list
, отсортированный в порядке возрастания.
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()))
sorted(set(sum(content.values(), [])))
Используйте понимание списка, чтобы сгенерировать неуникальный список, преобразовать его в набор, чтобы получить уникальные значения, а затем обратно в отсортированный список. Возможно, не самое эффективное, но еще одно однострочное решение (на этот раз без импорта).
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])))