2013-06-17 1 views
0

튜플 세트가 있습니다. 예를 들면 : itertools.groupby() in python

set([(('E', ('T',)), 0), 
(('F', ('(', 'E', ')')), 0), 
(('T', ('F',)), 0), 
(('__S__', ('E', '$')), 0), 
(('E', ('E', '+', 'T')), 0), 
(('T', ('T', '*', 'F')), 0), 
(('F', ('id',)), 0)]) 

당신이 첫 번째 요소 (. 예 ('F'('(', 'E'가 ')')))의로 모든 튜플은 튜플을 가지고 보는 바와 같이

.
이 튜플의 첫 번째 요소는 단일 문자이고 두 번째 요소는 다른 튜플입니다 (예 : ('(', 'E', ')')))). 이 튜플은 하나 이상의 단일 문자를 포함합니다.
첫 번째 요소는 규칙 (머리)의 LHS이고 두 번째 튜플은 RHS (본문)
각 튜플의 두 번째 요소에있는 숫자는이 문법의 RHS에있는 문자 중 하나에 대한 포인터입니다.

제가이 지적 된 요소에 대한 튜플 그룹화 할 일은 시도하고이 목적을 위해
가 내가 쓴 코드 다음.

import itertools 
S = set([(('E', ('T',)), 0), (('F', ('(', 'E', ')')), 0), (('T', ('F',)), 0), (('__S__', ('E', '$')), 0), (('E', ('E', '+', 'T')), 0), (('T', ('T', '*', 'F')), 0), (('F', ('id',)), 0)]) 
for v, h in itertools.groupby(S, lambda x: x[0][1][x[1]] if len(x[0][1]) > x[1] else None): 
    if (v is None): 
     continue 
    print '--' 
    print v 
    for hi in h: 
     print hi 

두 개의 튜플이 동일한에 x [0] [1] [x [1]]가 같은 경우 그룹 x [0] [1]은 (는) d 튜플 (문법의 RHS)과 x [1]은 포인터입니다. 나는 결과 다음과 같은 얻을
:

-- 
(
(('F', ('(', 'E', ')')), 0) 
-- 
F 
(('T', ('F',)), 0) 
-- 
E 
(('__S__', ('E', '$')), 0) 
-- 
T 
(('T', ('T', '*', 'F')), 0) 
-- 
id 
(('F', ('id',)), 0) 
-- 
T 
(('E', ('T',)), 0) 
-- 
E 
(('E', ('E', '+', 'T')), 0) 

당신이 키 'T'두 그룹이 볼 수 있듯이. 내가 뭘 잘못하고 있는지 이해가 안돼!
저는 거의 새로운 파이썬 프로그래머입니다. 문제가 너무 어리 석다면!
감사합니다.

+1

는 나는이 대답 할만큼 충분히 코드를 따라 모르겠지만, 문제는 (정렬되지 않은 임)'set'을 사용하고 있는지 생각합니다. 'groupby'에 전달하기 전에 groupby 키 함수를 사용하여 세트를 정렬해야 할 수도 있습니다. – mgilson

답변

3

itertools.groupby()는 모두 같은 데이터를 그룹화 할 경우 데이터가 documentation에 따라, 정렬 할 필요

는 일반적으로, 반복 가능한 요구는 이미 같은 키 기능을 정렬 할 수 있습니다.

groupby()의 작업은 Unix의 uniq 필터와 비슷합니다. 은 키 키의 값이 변경 될 때마다 끊기 또는 새 그룹을 생성합니다 (이는 동일한 키 기능을 사용하여 데이터를 으로 정렬해야하는 이유입니다). 이 동작은 입력 순서에 관계없이 공통 요소를 집계하는 SQL의 GROUP BY와 다릅니다.

먼저 데이터에 sorted() (기능을 키 기능으로 사용)이라고 부르고 그룹화하십시오.

key_func = lambda x: x[0][1][x[1]] if len(x[0][1]) > x[1] else None 
itertools.groupby(sorted(data, key=key_func), key_func) 
+0

고마워요! 그것은 매력처럼 일했습니다! 설명서를 읽지 않았으며 검색 기능이 거의 없습니다. – Ashkan