2014-09-17 4 views
0

튜플 목록에 포함 된 일부 데이터가 있습니다. 다른 파트가 특정 조건 세트를 충족시키는 경우 각 튜플의 한 부분을 합치기를 원합니다.조건부로 튜플 및 합계 목록에 액세스

var = [("car", '1'), ("dog", '1'), ("mercedes", '1'), ("cat", '1'), ("ferrari", '1'), ("bird", '1')] 

내가 나를 위의 구조에있는 모든 숫자 데이터에 액세스 할 수 있도록 다음과 같은 코드가 있습니다 : 다음은 몇 가지 예를 들어 데이터는이 다음과 같은 형식으로 데이터를 출력합니다

var = [x[1] for x in var] 
print ",".join(map(lambda x: str(x).strip(), var)) 

:

1,1,1,1,1,1 

내가 대신 지능형리스트에 x[0]을 사용하는 경우에 나는의 출력을 얻을 것이다 :

을 617,451,515,
car, dog, mercedes, cat, ferrari, bird 

내가 생각하고 싶은 것은 말한다 뭔가 :

if x[0] == "car" or x[0] == "mercedes" or x[0] == "ferrari" then var2 == x[1] + x[1] + x[1] 
print var2 

을 내가 그 위에서 작동하지 않습니다 있으리라 믿고있어,하지만 난 그것을 코딩하는 방법을 정말 잘 모르겠어요 그게 효과가 있습니다.

위의 내용은 간단한 데모입니다.

[("'goal','corner','rightfoot'", '1'), ("'goal','directfreekick','leftfoot'", '1'), 
("'goal','openplay','leftfoot'", '1'), ("'goal','openplay','rightfoot'", '2'), 
("'miss','corner','header'", '3'), ("'miss','directfreekick','leftfoot'", '1'), 
("'miss','directfreekick','rightfoot'", '1'), ("'miss','openplay','header'", '3'), 
("'miss','openplay','leftfoot'", '8'), ("'miss','openplay','rightfoot'", '11')] 

... 내가 구문 분석하는 데 사용하고있는 정확한 구문은 다음과 같습니다 : 나는 구문 분석하고 전체 문자열입니다 regex2은 튜플의리스트의 값을 할당

matching = {"'goal','openplay','leftfoot'", "'goal','openplay','rightfoot'", "'goal','corner','leftfoot'", "'goal','corner','rightfoot'"} 
regex2 = [value for key, value in regex2 if key in matching] 
regex2 = sum(int(value) for key, value in regex2 if key in matching) 
print regex2 

... 위. 합계 줄은 오류의 원인입니다. 그 위에 라인이 인쇄 않도록 :

['1', '1', '2'] 

답변

3

조건에 맞는 발전기 표현, 테스트에 사용 sum() :

matching = {'car', 'mercedes', 'ferrari'} 
sum(int(value) for key, value in var if key in matching) 

발전기 표현이 많은 목록의 이해가하는 것과 동일한 않습니다; 목록을 반복하고 각 요소를 사용하여 무언가를하십시오. 루프에서 튜플 할당을 사용하기로했습니다. 각 튜플의 두 요소는 각각 keyvalue에 할당됩니다. 그런 다음 if 문 (key 값이 matching 집합의 구성원 인 경우)을 사용하여 필터링하고 합계에 value 부분 만 사용하십시오. 당신이 값을 사용할 때 물론

>>> var = [("car", '1'), ("dog", '1'), ("mercedes", '1'), ("cat", '1'), ("ferrari", '1'), ("bird", '1')] 
>>> matching = {'car', 'mercedes', 'ferrari'} 
>>> [value for key, value in var if key in matching] 
['1', '1', '1'] 
>>> sum(int(value) for key, value in var if key in matching) 
3 

, 이것은 좀 더 흥미로운 가져옵니다을 보여

빠른 데모는 값의 하위 집합 만이 선택됩니다 있음을 보여주는리스트 통합 버전을 포함하여, 무슨 일 내 솔루션을 구현하는 당신의 시도에 대해서는

>>> var = [("car", '8'), ("dog", '2'), ("mercedes", '16'), ("cat", '4'), ("ferrari", '32'), ("bird", '64')] 
>>> [value for key, value in var if key in matching] 
['8', '16', '32'] 
>>> sum(int(value) for key, value in var if key in matching) 
56 

, 당신은 값으로 목록을 원본 목록을 대체 : 다른 '1'보다.목록 이해 라인 리 바인딩 regex2를 제거하고 단지 sum() 라인을 실행합니다 회신에 대한

>>> regex2 = [("'goal','corner','rightfoot'", '1'), ("'goal','directfreekick','leftfoot'", '1'), 
... ("'goal','openplay','leftfoot'", '1'), ("'goal','openplay','rightfoot'", '2'), 
... ("'miss','corner','header'", '3'), ("'miss','directfreekick','leftfoot'", '1'), 
... ("'miss','directfreekick','rightfoot'", '1'), ("'miss','openplay','header'", '3'), 
... ("'miss','openplay','leftfoot'", '8'), ("'miss','openplay','rightfoot'", '11')] 
>>> matching = {"'goal','openplay','leftfoot'", "'goal','openplay','rightfoot'", "'goal','corner','leftfoot'", "'goal','corner','rightfoot'"} 
>>> sum(int(value) for key, value in regex2 if key in matching) 
4 
+0

안녕하세요, 감사합니다. 이것은 내가 원하는 것을 할 것 같은데, 유일하게 복잡한 요소는 내가 사용하고있는 실제 변수의 형식입니다. 내 실제 튜플 중 하나의 예입니다 (IDLE 화면에 인쇄 할 때) : "('목표', 'directfreekick', 'leftfoot'", '1') ... 그래서 일치하는 말을 시도했다 {{ " '목표', 'directfreekick', 'leftfoot' "} 그러나 이것은 'exceptions.ValueError : 압축하는 데 1 개 이상의 값이 필요합니다'라는 오류를 발생시킵니다. 이는 내 일치하는 명령문이 올바르지 않기 때문에 추정됩니다. – gdogg371

+0

적어도 * one * 요소가있는 튜플이 하나 이상있는 것 같습니다. 귀하의'매칭'세트 정의가 잘 보인다. –

+0

... ive는 그들 모두를 보았고 그들 모두는 두 요소를 가지고 있습니다. – gdogg371