2017-03-28 1 views
2

제가 사용하는 지구 화학적 모델의 결과는 단계 당 300ish 화학 종으로 3000+ 단계를 생성합니다.다른리스트의 값을 찾고 그 값을 사전에 추가합니다.

나는 내가 관심이있는 종과 값의 목록을 가지고있다.

을 어떻게 I에서 다음 내가 관심 (종)이야 종의 목록을 사용하여 데이터 (주)을 반복 관련 종 목록의 두 번째 값을 각 종에 대해 if x=='y':list['x'].append(value) 문을 100 개 입력하지 않고 사전의 키에 추가하십시오.

이 내 코드의 단순화 된 버전입니다 :

for value in main: 
    if value==i for i in species: 
     maindict[i].append(value[2]) 

하지만 분명이 정말 작동하지 않습니다

main =[['a',1,2,3],['b',4,5,6],['c',7,8,9],['a',10,11,12],['b',13,14,15],['c',16,17,18] 
species = ['a', 'b', 'c'] 
maindict={'a':[],'b':[],'c':[]} 

for value in main2: 
    for x in value: 
     if x=='a':maindict['a'].append(value[2]) 
     elif x=='b':maindict['b'].append(value[2]) 
     elif x=='c':maindict['c'].append(value[2]) 

내가 무엇을 찾고 있어요 것은 조금 같은 간단한 일입니다.

출력 :

maindict={'a':[3,12],'b':[6,15],'c':[9,18] 
+1

'[' ': [1,2,3],'b ': [4,5,6],'c ': [7,8,9]'구문이 잘못되었습니다. 변수가 ** list's **이고 변수가 ** dict's ** 인 변수를 구체적으로 나타낼 수 있습니까? –

+1

왜 모든 목록 및 사전이 필요한가요? 'main'만으로 maindict = {k : [x [2]] main.items()에서 k, x에 대해 원하는 것을 할 수 있습니다. –

+0

초기 코드를 엉망으로 만들었습니다. 다시 시도하십시오 – potatasbravas

답변

1

당신은 메인의 각 항목을 통해 루프가 첫 번째 항목은 maindict에있는 경우, 다음 maindict에 올바른 항목을 추가 확인하실 수 있습니다

main =[['a',1,2,3],['b',4,5,6],['c',7,8,9],['a',10,11,12],['b',13,14,15],['c',16,17,18]] 
species = ['a', 'b', 'c'] 
maindict={'a':[],'b':[],'c':[]} 


for entry in main: 
    if entry[0] in maindict: 
     maindict[entry[0]].append(entry[3]) 
    else: 
     maindict[entry[0]] = [entry[3]] 

print maindict 

>>> {'a': [3, 12], 'c': [9, 18], 'b': [6, 15]} 
+0

주 txt 파일의 모든 데이터를 목록 형식 (주)으로 넣었지만 dict이 더 좋을 수도 있습니다 – potatasbravas

+0

목록에 키 값을 사용할 수 없으므로 원래 게시물에 구문 오류가 있습니다. 마지막 대괄호를 닫습니다. main = [ 'a': [1,2,3], 'b': [4,5,6], 'c': [7,8,9] – Kyle54

+0

죄송합니다. 삭제하고 다시 시도하십시오 – potatasbravas

0

점 dict가있는 것은 순차적 인 조회를 피하는 것입니다.

from collections import defaultdict 

def collect(source, species): 
    result = defaultdict(list) 
    for key in species: 
     found = source.get(key) 
     if found: 
      result[key].append(found[2]) 
    return result 


source ={'a':[1,2,3],'b':[4,5,6],'c':[7,8,9], 'd':[0, 0, 0]} 
species = ['a', 'b', 'c', 'e'] 

result = collect(source, species) 
print result 

편집 : 확인 그래서 당신의 소스가 실제로 딕셔너리 아니다 ... 여기리스트 목록에서 작업하는 업데이트 된 버전입니다 (소스는 아마 튜플의 목록이어야합니다 있습니다하지만 다른 점이다) :

from collections import defaultdict 

def collect(source, species): 
    result = defaultdict(list) 
    for row in source: 
     key = row[0] 
     if key in species: 
      result[key].append(row[2]) 
    return result 


source =[['a', 1,2,3], ['b', 4,5,6],['c', 7,8,9], ['d', 0, 0, 0]} 
# a set provides a huge perf improvement over a plain list here 
species = set(['a', 'b', 'c', 'e']) 

result = collect(source, species) 
print result 
+0

종마다 약 3000+ 값이 있습니다. 현재 초기 텍스트 파일을 읽은 방법으로 각 행을 목록에 넣었습니다. 그래서 나는 첫 번째 값 (종의 이름이 됨)으로 각 목록을 찾고 있습니다. – potatasbravas

+0

나는 아직도 이해하지 못한다.원본 dict에있는 specie 당 몇 개의 값이 무관합니다. 항상 세 번째 값만 검색하면 결과 dict의 specie 당 하나의 값만 가질 수 있습니다. –

+0

내 초기 코드를 엉망으로 만들었습니다. 삭제하고 다시 시도해보십시오. – potatasbravas

관련 문제