2011-02-14 7 views
0

그래서,Python : 사전 목록에 추가하기

월요일의 경우와 나의 참조가없는 경우에 나를 돕고있다. {X1 : [Y1, Z1], [Y2, Z2], X2 :

x1 y1 z1 
x1 y2 z2 
x2 y3 z3 

는 I는 다음과 같이 포맷 된 사전을하고자 :

I는 다음과 같이 포맷 된 파일이 [ y3, z3]}하지만이 작업을 효율적으로 수행해야합니다. 도움? 그것은 차례로 각 라인에서 추출 된 키 - 값 쌍의 사전을 만들어

def makeKeyValuePair(tokens): 
    return tokens[0], tokens[1:] 

print dict(makeKeyValuePair(line.rstrip().split()) for line in fileObject) 

:

+0

. (변경 가능한) 시퀀스에 추가합니다. 콜렉션이 섞이지 않도록하십시오.) – delnan

답변

4

난 당신이 문자열 그런

data_str = """x1 y1 z1 
       x1 y2 z2 
       x2 y3 z3""" 

시작 말할거야 당신이해야

data_list = [d.split() for d in data_str.splitlines()] # [['x1', 'y1', 'z1'], ['x1', 'y2', 'z2'], ['x2', 'y3', 'z3']] 

그런 다음 defaultdict를 작성하십시오.

,713,751,466,751,013,210
+1

+ 솔루션 전체에 대해 +1하고 한 번에 바로 얻으십시오;) 파이썬 3에서는 key, data_list의 * 값을 사용할 수도 있습니다 (iterable unpacking, * extremely * neat). – delnan

+0

그래, 키와 값 요소 사이의 차이점을 지정하지 못하고, python3이 가져 오는 멋진 점은 iterables를 언 패킹하는 데 사용되는 언 패킹 함수 인수의 표기법을 허용한다. –

1

은 당신이 뭔가를 할 수 있습니다. 물론 x1, y1 등에는 공백이 포함되지 않는다고 가정합니다.

delnan이 지적했듯이 사용 사례에 따라 중복 키가있을 수 있습니다. 즉, 해당 키를 사용하여 마지막 행의 값만 가져옵니다. 이 문제를 해결하기 위해, 하나는이 defaultdict 사용할 수 있습니다

from collections import defaultdict 
d = defaultdict(list) 

for line in fileObject: 
    tokens = line.rstrip().split() 
    d[tokens[0]].append(tokens[1:]) 
+0

아니요, 키가 여러 번 나타나는 경우 목록을 덮어 씁니다. 'defaultdict'가 필요합니다. – delnan

+0

@delnan : 고유 키는 내가 작성한 또 다른 가정입니다 ...'defaultdict' 솔루션을 포함하도록 편집 할 것입니다. – AndiDog

+0

글쎄, 고유 한 키가 OP의 예와는 명백하게 다릅니다.) – delnan

0
d={} 
for line in file: 
    split = line.strip().split(" ") 
    if not d.has_key(split[0]): d[split[0]] = [] 
    d[split[0]].append(split[1:]) 
+0

이것은 AndiDog의 대답과 같은 문제입니다 : 중복 된 항목을 덮어 씁니다. – delnan

+0

@delnan 명백하게 저자는 월요일의 나쁜 경우가있는 유일한 사람이 아니다. –

+0

겉으로보기에는. 이제 그것은 가난한 사람이'collections.defaultdict'를 재창조 한 것입니다.) – delnan

0

이 작업을 수행 할 수 있습니다 : 당신은 매핑에 추가하지 않습니다

result = { } 
for line in lines: 
    terms = line.split() 
    result.setdefault(terms[0], []).append(terms[1:]) 
관련 문제