2015-06-29 2 views
1

Предположит, что мы имеем следующий текстовый файл с колонкой a и колонками b:Вывести строки с ограничением в Python

D000001 T109 
D000001 T195 
D000002 T115 
D000002 T131 
D000003 T073 
D000004 T170 

Интересно, как произвести следующую структуру:

D000001 T109 T195 
D000002 T115 T131 
D000003 T073 
D000004 T170 

Вставленной ниже начальные скелет в Python.

from __future__ import print_function 

with open('descr2semtype_short.txt') as f: 
    for line in f: 
     line = line.rstrip() 
     a, b = line.split() 
     print(a + ' ' + b) 
+0

Я не тот, кто проголосовал вниз, но это может быть связано с тем, как вы задали вопрос, так как он не сможет сделать кластеризацию – The6thSense

+0

Вы можете использовать Dict, с 'Ā' существа ключ и 'b' добавляются в список, если ключ уже существует в dict или' mydict [a] = [b] ', когда ключ не существует. Для чего вы можете использовать либо defaultdict', либо 'dict.setdefault()'. – Evert

ответ

3

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

И затем распечатать их в конце.

Пример -

from __future__ import print_function 

d = {} 
with open('descr2semtype_short.txt') as f: 
    for line in f: 
     line = line.rstrip() 
     a, b = line.split() 
     if a not in d: 
      d[a] = [] 
     d[a].append(b) 

for k,v in d.iteritems(): 
    print(k + ' ' + ' '.join(v)) 

С Python 2.7 и далее, если порядок строк имеет важное значение, то вместо Dictionary, мы можем использовать OrderedDict.

Пример -

from __future__ import print_function 
from collections import OrderedDict 

d = OrderedDict() 
with open('descr2semtype_short.txt') as f: 
    for line in f: 
     line = line.rstrip() 
     a, b = line.split() 
     if a not in d: 
      d[a] = [] 
     d[a].append(b) 

for k,v in d.items(): 
    print(k + ' ' + ' '.join(v)) 
+0

Если заказ важен, мы можем использовать OrderedDict. –

4

Вы можете использовать itertools.groupby:

import itertools, operator 
with open('descr2semtype_short.txt') as f: 
    for key, items in itertools.groupby(
     (line.rstrip().split(None,1) for line in f), 
     operator.itemgetter(0)): 
     print(key, ' '.join(item[1] for item in items)) 

, который дает желаемый результат:

D000001 T109 T195 
D000002 T115 T131 
D000003 T073 
D000004 T170 
0

Я бы сделать это с OrderedDic т, таким образом:

from collections import OrderedDict 

d = OrderedDict() 
with open('1.txt', 'r') as f: 
    for line in f: 
     a,b = line.strip().split() 
     print a,b 
     if a not in d: 
      d[a] = [b] 
     else: 
      d[a].append(b) 
print d 

Выход:

OrderedDict([('D000001', ['T109', 'T109', 'T195']), ('D000002', ['T115', 'T115', 'T131']), ('D000003', ['T073', 'T073']), ('D000004', ['T170', 'T170', 'T175', 'T180'])])