2016-11-02 9 views
0

ファイル入力からデータを処理しようとしています。 1行に3つの値が空白で区切られています。私は2番目の値でグループ化されるリストにそれらを追加しようとしています。そう、私は入力があります。Python - 1つの要素でリストをグループ化する

qwe rty 12 
asd fgh 34 
zxc rty 96 

をし、私はそれがこのような変数に格納したい:

variable = 
[[[qwe, rty, 12], [zxc, rty, 96]], 
[[asd, fgh, 34]]] 

私はこのようにアクセスできるように、これは次のとおりです。

variable[0] #this should be [[qwe, rty, 12], [zxc rty, 96]] 
variable[1] #this should be[[asd, fgh, 34]] 

私は努力しています

f = open('input_1.txt') 
values = [] #to keep track of which values have occured before 
data = [] 
for line in f: 
    ldata = lineprocess(line) #this transforms the raw data to [qwe, rty, 12] etc. 
    if ldata[1] in values: 
     data[values.index(ldata[1])].append(ldata) 
    elif ldata[1] not in values : 
     values.append(ldata[1]) 
     data.append(ldata) 

これは、しかし、このようなリストを回す:

[['qwe', 'rty', 12, ['zxc', 'rty', 96]], 
['asd', 'fgh', 34]] 

は、私が代わりに

[[['qwe', 'rty', 12], ['zxc', 'rty', 96]], 
[['asd', 'fgh', 34]]] 

を取得するために何をすべき?

+0

これは非常に奇妙なデータ構造です。あなたは何を正確に作りようとしていますか?代わりにこのデータを参照しやすくするために辞書を使うことを考えましたか? – idjaw

+0

私が必要とする主なものは、データをグループ化することです。だから私は3つの値のリストを持っている入力ファイルから、これをトリプルと呼んでみましょう。同じインデックスの下で同じ中間値を持つトリプルを持つようにグループ化したいので、別のプロセスに言うことができます。つまり、インデックス0のすべてのトリプルと次のトリプルを処理する必要がありますプロセスはインデックス1などの下ですべてのトリプルを使用する必要があります –

答えて

0

dataには、リストだけでなく、リストが含まれている必要があります。

f = open('input_1.txt') 
values = [] #to keep track of which values have occured before 
data = [] 
for line in f: 
    ldata = lineprocess(line) #this transforms the raw data to [qwe, rty, 12] etc. 
    if ldata[1] in values: 
     data[values.index(ldata[1])].append(ldata) 
    else: 
     values.append(ldata[1]) 
     data.append([ldata]) 

は考えてみましょう:

a = [1,2,3] 
b = [4,5,6] 
a.append(b) 
print a # [1, 2, 3, [4, 5, 6]] 
c = [[1,2,3]] 
c.append(b) 
print C# [[1, 2, 3], [4, 5, 6]] 
+1

ありがとう!問題は 'values'変数ではなく' data'ですが、私はあなたのポイントを見ています!私は 'data [games.index(ldata [1])] =([ldata])';)が必要でした –

2

あなたは辞書をしたくない場合は、あなたがgroupby

from itertools import groupby 
from operator import itemgetter 

with open(...) as lines: 
    parsed_lines = map(lineprocess, lines) # I'm using your `lineprocess` 
    second_item = itemgetter(1) 
    groups = groupby(sorted(parsed_lines, key=second_item), second_item) 
    result = [list(group) for predicate, group in groups] 

を使用することができます。これは、あなたのO(n^2)よりも優れているO(nlogn)平均的なケースのパフォーマンスを、持っています。それでも、辞書ベースのソリューションはO(n)です。

関連する問題