Python Список словарей с кортежами в качестве ключей - PullRequest
0 голосов
/ 31 октября 2018

У меня есть словарь, подобный этому

Counter({('know', 'you'): 1053, ('know', 'i'): 847, ('il', 'i'): 784, 
         ('want', 'to'): 680, ('want', 'you'): 561, ('il', 'you'): 561, 
         ('come', 'on'): 557, ('know', 't'): 499, ('go', 'to'): 447, 
         ('right', 'all'): 440, ('want', 'i'): 430, ('know', 'don'): 410, 
         ('get', 'to'): 409, ('like', 'you'): 397, ('like', 'i'): 338, 
         ('get', 'you'): 336, ('il', 'be'): 330})

И я хочу создать список словарей, где в каждом словаре есть только кортежи с одинаковым первым элементом, что-то вроде этого

[{('know', 'you'): 1053, ('know', 'i'): 847, ('know', 't'): 499,('know', 'don'): 410}, 
 {('want', 'to'): 680, ('want', 'you'): 561, ('want', 'i'): 430},  
 {('get', 'to'): 409, ('get', 'you'): 336}, 
 {('like', 'you'): 397, ('like', 'i'): 338}]

После этого я хочу сохранить значения из каждого словаря во вложенном списке и создать массив. Вложенный список будет выглядеть так

[[1053, 847, 499, 410], [680, 561, 430], [409, 336], [397, 338]]

У вас есть идеи, как мне это сделать?

РЕДАКТИРОВАТЬ: После некоторых комментариев я понял, что также второй элемент в кортеже должен соответствовать другим элементам. Таким образом, список словарей должен выглядеть так:

[{('know', 'you'): 1053, ('know', 'i'): 847, ('know', 'to'): 499}
 {('want', 'you'): 5, ('want', 'i'): 430},  ('want', 'to'): 680}
 {('get', 'you'): 3, ('get', ‚i'): 68, ('get', 'to'): 409}
 {('like', 'you'): 397, ('like', 'i'): 338}, ('like', 'to'): 345}]

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Для получения окончательного результата вы можете использовать setdefault :

data = {('know', 'you'): 1053, ('know', 'i'): 847, ('il', 'i'): 784, ('want', 'to'): 680, ('want', 'you'): 561,
        ('il', 'you'): 561, ('come', 'on'): 557, ('know', 't'): 499, ('go', 'to'): 447, ('right', 'all'): 440,
        ('want', 'i'): 430, ('know', 'don'): 410, ('get', 'to'): 409, ('like', 'you'): 397, ('like', 'i'): 338,
        ('get', 'you'): 336, ('il', 'be'): 330}


result = {}
for k, v in data.items():
    result.setdefault(k[0], []).append(v)

print([e for e in result.values()])

выход

[[561, 680, 430], [447], [397, 338], [440], [847, 1053, 499, 410], [336, 409], [784, 561, 330], [557]]

Если по какой-то причине вам требуется промежуточное представление, вы можете сделать следующее:

from itertools import groupby

data = {('know', 'you'): 1053, ('know', 'i'): 847, ('il', 'i'): 784, ('want', 'to'): 680, ('want', 'you'): 561,
        ('il', 'you'): 561, ('come', 'on'): 557, ('know', 't'): 499, ('go', 'to'): 447, ('right', 'all'): 440,
        ('want', 'i'): 430, ('know', 'don'): 410, ('get', 'to'): 409, ('like', 'you'): 397, ('like', 'i'): 338,
        ('get', 'you'): 336, ('il', 'be'): 330}


result = [dict(group) for _, group in groupby(sorted(data.items()), key=lambda x: x[0][0])]    
    print(result)

Вывод ( промежуточное представление )

[{('come', 'on'): 557}, {('get', 'to'): 409, ('get', 'you'): 336}, {('go', 'to'): 447}, {('il', 'i'): 784, ('il', 'be'): 330, ('il', 'you'): 561}, {('know', 'i'): 847, ('know', 't'): 499, ('know', 'you'): 1053, ('know', 'don'): 410}, {('like', 'i'): 338, ('like', 'you'): 397}, {('right', 'all'): 440}, {('want', 'i'): 430, ('want', 'you'): 561, ('want', 'to'): 680}]
0 голосов
/ 31 октября 2018

Вам нужен промежуточный список словарей? Вы можете легко достичь своей цели прямо из входного словаря.

from collections import defaultdict

out = defaultdict(list)

for k, v in input_dict.items():
    out[k[0]].append(v)

print(out)
# defaultdict(<class 'list'>, {'know': [1053, 847, 499, 410], 'il': [784, 561, 330], 
#                              'want': [680, 561, 430], 'come': [557], 'go': [447],
#             '                'right': [440], 'get': [409, 336], 'like': [397, 338]})

тогда, если вы настаиваете на вложенных списках:

print([v for v in out.values()])
# [[1053, 847, 499, 410], [784, 561, 330], [680, 561, 430], [557], [447], [440],
#  [409, 336], [397, 338]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...