2016-12-27 2 views
1

Упрощение моей проблемы, у меня есть словарь словарей в моем конвейере, который я хочу напечатать в виде таблицы.печатать словарь словарей как таблицу

Например. Это мой словарь, напечатанный с использованием этого:

for k, v in dict.items(): 
     if len(v) >= float(2): 
       print k , v 

NODE_2908 [{'NODE_2908_1': 'gi|497712399|'}, {'NODE_2908_2': 'gi|817665741|'}] 
NODE_334 [{'NODE_334_2': 'gi|639993929|'}, {'NODE_334_3': 'gi|652409655|'}] 
NODE_246 [{'NODE_246_1': 'gi|754171522|'}, {'NODE_246_2': 'gi|658510970|'}] 

Простой текстовый файл со своими значениями. Но я хочу напечатать «v» как табличное, избегая специальных символов «(, ', [,], {" и разделяемых «\ t». Как это:

NODE_2908 NODE_2908_1: gi|497712399 NODE_2908_2: gi|817665741| 
NODE_334 NODE_334_2: gi|639993929| NODE_334_3: gi|652409655| 
NODE_246 NODE_246_1: gi|754171522| NODE_246_2: gi|658510970| 

Я попытался это с любым успехом:

for k, v in dict.items(): 
     if len(v) >= float(2): 
       print k + '\t' + str(('\t').join(sorted(v))) 

Всплывающие ошибка:

print k + '\t' + str(('\t').join(sorted(v))) 
TypeError: sequence item 0: expected string, dict found 

Предложения сохраняющие эту структуру будут оценены. Заранее спасибо.

+1

Что это: 'если Len (v)> = float (2) 'все о? –

+0

Я включил это, чтобы печатать только клавиши с более чем двумя значениями. –

+0

Да, понятно, но зачем использовать 'float'? –

ответ

1

Это своего рода грязный, но он должен работать:

from itertools import chain 
for k, v in d.items(): 
    if len(v) >= 2: 
     print("\t".join(chain([k], *(item for dd in v for item in dd.items())))) 

Результат:

NODE_2908 NODE_2908_1 gi|497712399| NODE_2908_2 gi|817665741| 
NODE_246 NODE_246_1 gi|754171522| NODE_246_2 gi|658510970| 
NODE_334 NODE_334_2 gi|639993929| NODE_334_3 gi|652409655| 

Или, может быть, без itertools:

In [25]: for k, v in d.items(): 
    ...:  if len(v) >= 2: 
    ...:   print(k + '\t' + "\t".join(s for dd in v for t in dd.items() for s in t)) 
    ...:   
    ...:   
NODE_2908 NODE_2908_1 gi|497712399| NODE_2908_2 gi|817665741| 
NODE_246 NODE_246_1 gi|754171522| NODE_246_2 gi|658510970| 
NODE_334 NODE_334_2 gi|639993929| NODE_334_3 gi|652409655| 
+0

Он работал (без itertools). Спасибо. –

0

Я мог бы сделать что-то лучшее преобразование «v» в строку и после замены.

for k, v in dict_blast.items(): 
     if len(v) >= float(2): 
       print k + '\t' + str(v).replace("[{'", "").replace("': '", ": ").replace("'}, {'" , "\t").replace("'}]", "") 

Я знаю, что это непонятно и красиво.

Смежные вопросы