Seite 2 von 2

Re: Konvertieren List to dict or json

Verfasst: Donnerstag 23. Oktober 2014, 13:16
von Sirius3
@mit: falls Du sehen willst, wie nahe Du schon an der Lösung warst:

Code: Alles auswählen

from collections import namedtuple, defaultdict
from pprint import pprint
 
DATA = [
    ["Test", "A", "B01", 828288,  1,    7, 'C', 4],
    ["Test", "A", "B01", 828288,  1,    7, 'C', 5],
    ["Test", "A", "B01", 828288,  1,    7, 'T', 6],
    ["Test", "A", "B01", 171878,  3,    8, 'C', 5],
    ["Test", "A", "B01", 171878,  3,    8, 'T', 6],
    ["Test", "A", "B01", 871963,  3,    9, 'A', 5],
    ["Test", "A", "B01", 871963,  3,    9, 'G', 6],
    ["Test", "A", "B01", 1932523, 1,   10, 'T', 4],
    ["Test", "A", "B01", 1932523, 1,   10, 'A', 5],
    ["Test", "A", "B01", 1932523, 1,   10, 'X', 6],
    ["Test", "A", "B01", 667214,  1,   14, 'T', 4],
    ["Test", "A", "B01", 667214,  1,   14, 'G', 5],
    ["Test", "A", "B01", 667214,  1,   14, 'G', 6],
]
 
Key = namedtuple('Key', "type name sub_name pos s_type x_type")
Value = namedtuple('Value', "letter no")

def main():
    grouped_data = defaultdict(list)
    for row in DATA:
        grouped_data[Key(*row[:6])].append(Value(*row[6:]))
    pprint(grouped_data)
    
if __name__ == '__main__':
    main()

Re: Konvertieren List to dict or json

Verfasst: Donnerstag 23. Oktober 2014, 15:02
von mit
@BlackJack: Ich habe versucht die listen Inhalt in eine Datei gespeichert:

Code: Alles auswählen

Test, A, B01, 828288,  1,    7, C, 5
Test, A, B01, 828288,  1,    7, T, 6
Test, A, B01, 171878,  3,    7, C, 5
Test, A, B01, 171878,  3,    7, T, 6
Test, A, B01, 871963,  3,    9, A, 5
Test, A, B01, 871963,  3,    9, G, 6
Test, A, B01, 1932523, 1,   10, T, 4
Test, A, B01, 1932523, 1,   10, A, 5
Test, A, B01, 1932523, 1,   10, X, 6
Test, A, B01, 667214,  1,   14, T, 4
Test, A, B01, 667214,  1,   14, G, 5
Test, A, B01, 667214,  1,   14, G, 6
Ich verwende eine "convert" Funktion, welche Datentypen erkennt und diese umwandelt.

Code: Alles auswählen

#!/usr/bin/env python
from __future__ import absolute_import, division, print_function
from itertools import groupby


DATA = [["Test", "A", "B01", 828288,  1,    7, 'C', 5],
        ["Test", "A", "B01", 828288,  1,    7, 'T', 6],
        ["Test", "A", "B01", 171878,  3,    7, 'C', 5],
        ["Test", "A", "B01", 171878,  3,    7, 'T', 6],
        ["Test", "A", "B01", 871963,  3,    9, 'A', 5],
        ["Test", "A", "B01", 871963,  3,    9, 'G', 6],
        ["Test", "A", "B01", 1932523, 1,   10, 'T', 4],
        ["Test", "A", "B01", 1932523, 1,   10, 'A', 5],
        ["Test", "A", "B01", 1932523, 1,   10, 'X', 6],
        ["Test", "A", "B01", 667214,  1,   14, 'T', 4],
        ["Test", "A", "B01", 667214,  1,   14, 'G', 5],
        ["Test", "A", "B01", 667214,  1,   14, 'G', 6]]


def iter_something(rows):
    key_names = ['type', 'name', 'sub_name', 'pos', 's_type', 'x_type']
    chr_key_names = ['letter', 'no']
    for keys, group in groupby(rows, lambda row: row[:6]):
        result = dict(zip(key_names, keys))
        result['chr'] = [dict(zip(chr_key_names, row[6:])) for row in group]
        yield result


def convert(val):
    constructors = [int, str]
    for c in constructors:
        try:
            return c(val)
        except ValueError:
            pass


def main():
    with open("/home/mic/tmp/test.txt") as f:
        for line in f:
            try:
                data = [convert(part.strip()) for part in line.split(',')]
                print(data)
            except IndexError:
                continue
    
        for object_ in iter_something(data):
            print(object_)


if __name__ == '__main__':
    main()
Wie könnte man an "iter_something" jede Dateizeile übergeben in den oberen Code?
Gibt es eine bessere Methode wie man Elemente in einer Liste umwandeln könnte, da man in diesem Beispiel weiß welches Element welchen Typ hat?

@Sirius3: Danke, manchmal sieht man den Wald vor lauter Bäumen nicht.

Re: Konvertieren List to dict or json

Verfasst: Donnerstag 23. Oktober 2014, 18:24
von BlackJack
@mit: Man könnte einen Iterator oder Generator schreiben der die Daten liefert und den übergeben. Die Funktion nimmt ja beliebige iterierbare Objekte die Listen mit entsprechend vielen Elementen liefern.

Und wieso musst Du so eine Typumwandlung auf Verdacht machen? Du kennst doch den Typ in jeder Spalte, oder nicht?

Re: Konvertieren List to dict or json

Verfasst: Freitag 24. Oktober 2014, 01:22
von mit
Danke fuer den Tipp. Ich habe generator verwendet, aber wenn man part.strip() benutzt, bekomme ich AttributeError: 'list' object has no attribute 'strip'.

Code: Alles auswählen

def main():
    with open("/home/mic/tmp/test.txt") as f:
        parts = (line.split(',') for line in f)
        column = (part.strip() for part in parts)
        for object_ in iter_something(column):
            print(object_)
Ich möchte nicht eine Typumwandlung auf Verdacht machen und ich weiss den Typ in jeder Spalte, aber leider weiss ich nicht wie man es eleganter und effizienter macht.

Re: Konvertieren List to dict or json

Verfasst: Freitag 24. Oktober 2014, 01:44
von cofi
`parts` ist ein Generator von Listen, da `str.split` eine Liste zurueckgibt. Darum ist `part` auch eine Liste und kein String.
Demnach brauchst du fuer `column` eine verschachtelte Generator Expression, zB

Code: Alles auswählen

column = (entry.strip() for part in parts for entry in part)

Re: Konvertieren List to dict or json

Verfasst: Freitag 24. Oktober 2014, 12:01
von mit
cofi hat geschrieben:`parts` ist ein Generator von Listen, da `str.split` eine Liste zurueckgibt. Darum ist `part` auch eine Liste und kein String.
Demnach brauchst du fuer `column` eine verschachtelte Generator Expression, zB

Code: Alles auswählen

column = (entry.strip() for part in parts for entry in part)
Leider bekomme ich jetzt eine seltsame Ausgabe:

Code: Alles auswählen

{'sub_name': 's', 'chr': [{}], 'type': 'T', 'name': 'e', 'pos': 't'}
{'chr': [{}], 'type': 'A'}
{'sub_name': '1', 'chr': [{}], 'type': 'B', 'name': '0'}
{'sub_name': '8', 'name': '2', 'x_type': '8', 'pos': '2', 's_type': '8', 'chr': [{}], 'type': '8'}
{'chr': [{}], 'type': '1'}
{'chr': [{}], 'type': '7'}
{'chr': [{}], 'type': 'C'}
{'chr': [{}], 'type': '5'}
{'sub_name': 's', 'chr': [{}], 'type': 'T', 'name': 'e', 'pos': 't'}
{'chr': [{}], 'type': 'A'}
{'sub_name': '1', 'chr': [{}], 'type': 'B', 'name': '0'}
{'sub_name': '8', 'name': '2', 'x_type': '8', 'pos': '2', 's_type': '8', 'chr': [{}], 'type': '8'}
.....