2015-01-13 6 views
0

У меня есть список таких: 372 374 375 533 849 1057 734 640 853 2 672 581 352 384 386 505 421 372 374 375 734 1354 1355 Я пытаюсь создать словарь в котором упоминается, какое число следует за определенным числом и сколько раз повторение повторялось.добавить словарь как структуру в словарь python

т.е. [ '372' :('374', 2), '375' :('533', 1), ('734', 1) ......]

так ключ - все элементы, а значение - список кортежей или список словаря, если это более подходит для доступа. Я попытался создать словарь, который имеет первое вхождение чисел в виде ключей и значения, которые сразу после этого являются его значениями, но поскольку они являются strs, я не могу добавить их к ним. Есть ли способ определить словарь для соответствия этой структуре?

for i,j in zip(xrange(0,len(IDs)), xrange(1,len(IDs))): 
    if not IDs[i] in mydict: 
     mydict[IDs[i]]=IDs[j] 
    else: 
     mydict[IDs[i]].append(IDs[j]) 

Я очень ценю ваше руководство.

ответ

1
from collections import defaultdict 
ids = [372, 374, 375, 533, 849, 1057, 734, 640, 853, 2, 672, 581, 352, 384, 386, 505, 421, 372, 374, 375, 734, 1354, 1355] 
mydict = defaultdict(lambda: defaultdict(int)) 
for i in xrange(len(ids)-1): 
    mydict[ids[i]][ids[i+1]] += 1 

Пример вывода:

>>>mydict[372] 
defaultdict(<type 'int'>, {374: 2}) 
+0

Да, потому что я хочу видеть, какие идентификаторы появляются после определенного ID и сколько раз это происходило для каждого из них. – user2628665

+0

ОК, я перечитал ваш вопрос и отредактировал свой ответ. Это должно быть то, что вы ищете сейчас. – Imran

0

Как ожидают каждый номер, как ключ и номер следуют и его граф в кортеже.

Но, как, например, числа , который затем как и .

И мы не можем иметь 734:(640, 1), 734:(1354, 1) как выходной Словарь, потому что мы не можем иметь дубликаты ключей.

Так что это может быть одним из возможных решений.

my_list = [372, 374, 375, 533, 849, 1057, 734, 640, 
      853, 2, 672, 581, 352, 384, 386, 505, 
      421, 372, 374, 375, 734, 1354, 1355] 

from collections import Counter   
result = Counter(zip(my_list[:-1], my_list[1:])) 
print result 

Урожайность:

Counter({ 
      (374, 375): 2, 
      (372, 374): 2, 
      (375, 734): 1, 
      (352, 384): 1, 
      (1354, 1355): 1, 
      (505, 421): 1, 
      (734, 1354): 1, 
      (853, 2): 1, 
      (849, 1057): 1, 
      (384, 386): 1, 
      (2, 672): 1, 
      (421, 372): 1, 
      (375, 533): 1, 
      (672, 581): 1, 
      (581, 352): 1, 
      (533, 849): 1, 
      (1057, 734): 1, 
      (640, 853): 1, 
      (386, 505): 1, 
      (734,640): 1 
          }) 

И вы можете получить рассчитывать на пары, как:

print "(374, 375): ", result[(374, 375)] 
print "(374, 375): ", result[(734,640)] 

Результаты:

(374, 375): 2 
(374, 375): 1 
+0

Проблема заключается в том, что этот метод не отображает список элементов, которые были повторены, например, 734 сопровождалось 640 раз и 1353 в другое время, но на выходе показано, что за 734 последовало 1354 два раза. – user2628665

+0

@ user2628665 Просмотрите мой отредактированный ответ. благодаря –

0

Я считаю, что это то, что вы ва nt

my_list = [372, 374, 375, 533, 849, 1057, 734, 640, 
       853, 2, 672, 581, 352, 384, 386, 505, 
       421, 372, 374, 375, 734, 1354, 1355 
       ] 

    adict = {} 
    for k in range(len(my_list)-1): 

     count = 0 
     now_at = my_list[k] 
     nxt_at = my_list[k+1] 

     for i in range(len(my_list)-1): 
      curr = my_list[i] 
      nxt = my_list[i+1] 

      if now_at == curr and nxt_at == nxt: 
       count += 1 
       adict[now_at] = (nxt_at , count) 
Смежные вопросы