簡體   English   中英

python中的itertools.groupby()

[英]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',')')))。 該元組中具有一個或多個單個字符。
(實際上是上下文無關文法。第一個元素是rule(頭部)的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]是第一個元組的第二個元組(語法的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”的組。 我不明白我在做什么錯!
我幾乎是新的python程序員。 萬一問題太愚蠢了!
謝謝!

如果要對所有類似數據進行分組,則itertools.groupby()要求對數據進行排序(根據文檔)

通常,可迭代項需要已經在相同的鍵功能上進行了排序。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM