2016-11-02 4 views
0

파일 입력에서 데이터를 처리하려고합니다. 한 줄에는 공백으로 구분 된 3 개의 값이 들어 있습니다. 두 번째 값으로 그룹화 할 목록에 추가하려고합니다. 그럼. I는 입력이 있습니다Python - 하나의 요소로 그룹 목록을 나열하십시오.

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)입니다.

관련 문제