2015-05-13 31 views
6

staram się przetworzyć plik, który wygląda mniej więcej tak:Python: Konwersja wielu instancji tego samego klucza do wielu wierszy

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

wiem, może na przykład używać Python shlex do analizowania tych bez główne problemy z czymś takim jak:

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

line = shlex.split(entry) 

Mogę następnie wykonać pętlę for i powtórzyć parami klucz-wartość.

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

Wyniki w:

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

tej pory tak dobrze, ale mam problem ze znalezieniem skutecznego sposobu wyprowadzania oryginalną linię tak, że wyjście wygląda następująco:

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=03s=Party! flag=urgent 
id=1221AB12 f=0412345678 t=03s=Party! flag=english 
+0

Czy kolejność tych par klucz-wartość ma znaczenie? –

+0

@SebastianPhilipp: tak. Powinny drukować w tej samej kolejności zawsze. (ponieważ wynik jest bardziej podobny do TSV niż wartość oddzielona spacją, jak pokazano) –

Odpowiedz

5

produktu od itertools i

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

wynik

s=Party! f=0412345678 flag=urgent id=1221AB12 t=0523456789 
s=Party! f=0412345678 flag=urgent id=1221AB12 t=03
s=Party! f=0412345678 flag=english id=1221AB12 t=0523456789 
s=Party! f=0412345678 flag=english id=1221AB12 t=03
+0

epicki! Umysł wyjaśniający, jaka jest funkcja * przed a? Nigdy nie widziałem tego przed –

+2

dla gwiazdy: http://stackoverflow.com/a/36908/4768939 (służy do rozpakowania listy argumentów) – valentin

+0

True! Widziałem to już wcześniej w okolicach args i kwargs ... aka ... jak rozpoznać okropnego programistę takiego jak ja. :-) –

Powiązane problemy