Я пытаюсь обработать файл, который выглядит примерно так:

f=0412345678 t=0523456789 t=0301234567 s=Party! flag=urgent flag=english id=1221AB12

Я знаю, что могу, например, использовать Python shlex для анализа тех, у кого нет серьезных проблем, например:

entry = "f=0412345678 t=0523456789 t=0301234567 s=Party! flag=urgent flag=english id=1221AB12"

line = shlex.split(entry)

Затем я могу выполнить цикл for и перебирать пары ключ-значение.

row = {}
for kvpairs in line:
    key, value = kvpairs.split("=")
    row.setdefault(key,[]).append(value)
print row

Результаты в:

{'id': ['1221AB12'], 's': ['Party!'], 'flag': ['urgent', 'english'], 't': ['0523456789', '0301234567'], 'f': ['0412345678']}

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

id=1221AB12 f=0412345678 t=0523456789 s=Party! flag=urgent 
id=1221AB12 f=0412345678 t=0523456789 s=Party! flag=english
id=1221AB12 f=0412345678 t=0301234567 s=Party! flag=urgent 
id=1221AB12 f=0412345678 t=0301234567 s=Party! flag=english
6
Andre de Miranda 13 Май 2015 в 14:40
Имеет ли значение порядок этих пар "ключ-значение"?
 – 
Sebastian Wagner
13 Май 2015 в 14:53
@ Себастьян Филипп: да. Они должны всегда печататься в одном и том же порядке. (поскольку результат больше похож на TSV, чем на значение, разделенное пробелами, как показано на рисунке)
 – 
Andre de Miranda
13 Май 2015 в 15:02

1 ответ

Лучший ответ

Продукт от itertools и

from itertools import product
from collections import OrderedDict
a = OrderedDict({'id': ['1221AB12'], 's': ['Party!'], 'flag': ['urgent', 'english'], 't': ['0523456789', '0301234567'], 'f':              ['0412345678']})
res = product(*a.values())
for line in res:
    print " ".join(["%s=%s" % (m, n) for m,n in zip(a.keys(), line) ])

Результат

s=Party! f=0412345678 flag=urgent id=1221AB12 t=0523456789
s=Party! f=0412345678 flag=urgent id=1221AB12 t=0301234567
s=Party! f=0412345678 flag=english id=1221AB12 t=0523456789
s=Party! f=0412345678 flag=english id=1221AB12 t=0301234567
5
valentin 13 Май 2015 в 16:18
Эпично! Разум, объясняя, какова функция * перед? Никогда раньше не видел
 – 
Andre de Miranda
13 Май 2015 в 15:00
2
Для звезды: stackoverflow.com/a/36908/4768939 (используется для распаковки списка аргументов)
 – 
valentin
13 Май 2015 в 15:03
Истинный! Я видел это раньше вокруг args и kwargs ... иначе ... как распознать ужасного кодера вроде меня. :-)
 – 
Andre de Miranda
13 Май 2015 в 15:09
Примерно так: for v in vrows: for k in krows: print ("% s =% s"% (str (k [0]), v [krows.index (k)])), print ""?
 – 
Andre de Miranda
13 Май 2015 в 16:00