[英]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.