Список словарей python с кортежами в качестве ключей

У меня есть такой словарь

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

в чем твоя проблема? где твой код? что с этим не так?

Patrick Artner 31.10.2018 13:47
1
1
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

Большое спасибо! Я новичок в Python, однажды я попытался это сделать, но это действительно очень просто! :-)

alise 31.10.2018 14:43

Возможно ли, что у нас есть соответствующие вторые элементы в каждом словаре, например: [{('знаю', 'ты'): 1053, ('знаю', 'я'): 847, ('знаю', 'чтобы '): 499}, {(' хочу ',' ты '): 5, (' хочу ',' я '): 430}, (' хочу ',' к '): 680}, {(' получить ' , 'you'): 3, ('get', ‚i '): 68, (' get ',' to '): 409}, {(' like ',' you '): 397, (' like ' , 'i'): 338}, ('like', 'to'): 345}] Итак, кортеж с «you» на первой позиции в каждом словаре, затем с «i» на второй позиции и т. д. ?

alise 31.10.2018 15:16

Чтобы получить окончательный результат, вы можете использовать установить по умолчанию:

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

Большое спасибо! Очень полезно!

alise 31.10.2018 14:45

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