Python группирует похожие строки в файле в одну строку - PullRequest
1 голос
/ 16 марта 2012

У меня в настоящее время есть файл, который очень неупорядочен

file.txt

vfc1 3435 4556
vfc1 2334 2123
vfc1 5556 1234
vfc2 8997 5969
vfc2 4543 3343
vfc2 1232 2123

Я хотел бы сделать так, чтобы этот файл был упорядочен таким образом, чтобы все строки в моем файле отображались в одной строке, чтобы он выглядел следующим образом:

file_output.txt
vfc1 1234 2123 2334 3435 4556 5556 
vfc2 1232 2123 3343 4543 5969 8997 

Ответы [ 5 ]

2 голосов
/ 16 марта 2012

Как насчет этого?

from collections import defaultdict

d = defaultdict(list)
with open('input.txt') as f:
    for line in f.readlines():
        data = line.split()
        d[data[0]].extend(data[1:])

with open('output.txt', 'w') as f:
    for key, value in d.iteritems():
        f.write(
            '%(key)s %(value)s\n' 
            % {'key': key, 'value': " ".join(sorted(value))}
        )
1 голос
/ 16 марта 2012

Может быть, что-то вроде этого:

d = {}

for line in file('file.txt'):
        if line.strip():
                sl = line.split()
                if d.has_key(sl[0]):
                        d[sl[0]] += ' %s' % ' '.join(sl[1:])
                else:
                        d[sl[0]] = ' '.join(sl[1:])

fd = open('file_output.txt', 'w')
for key in d:
        fd.write('%s %s\n' % (key, d[key]))

fd.close()
0 голосов
/ 16 марта 2012

Вы также можете использовать iterools.groupby для группировки строк по первому столбцу:

from collections import defaultdict
from itertools import chain, groupby

with open(input) as f:
    data = (x.split() for x in f)
    grouped = defaultdict(list)
    for key, group in groupby(data, key=lambda x: x[0]):
        for line in group:
            grouped[key] += line[1:]

for k,v in grouped.items():
    print k, ' '.join(v)
0 голосов
/ 16 марта 2012
my_file = open('file.txt', 'r')

lines = {}

for line in my_file:
    values = line.split()
    lines[values[0]] = lines.get(values[0], []) + values[1:]

my_file.close()
new_file = open('output_file.txt', 'w')

for k in lines:
    line = '%s %s\n' % (k, ' '.join(sorted(lines[k])))
    new_file.write(line)

new_file.close()
0 голосов
/ 16 марта 2012

Не зависит от Python.Больше похоже на псевдокод, но вот идея:

  • Получить все строки в массиве
  • Установить целевой массив
  • Установить массив "последней записи"
  • Установить глобальную переменную, чтобы определить текущий индекс
  • Пройти через массив:
    • Разделить строку, используя ' ' (пробел) в качестве разделителя, в массив parts
    • Является ли parts[0] == currentIndex?Если да, добавьте parts[1],parts[2] к lastEntry.
    • Если НЕТ, добавьте lastEntry к targetArray.Установите currentIndex = parts[0].Очистить lastEntry.Добавьте parts[1],parts[2] к lastEntry.

И все!: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...