2014-04-30 36 views
0

任何幫助都非常有幫助。我嘗試在這裏理解Iterable Object:<生成器對象in_a_row在0x0xxxxxxx>

這裏我必須定義一個函數in_a_row,它傳遞一個整數參數(稱爲n)和可迭代的參數。這個函數返回一組在迭代中出現在連續n次的值:in_a_row(2,[4,4,2,6,6,9,6,7,7,3,2,2])返回{2,4,6,7}。如果迭代器不包含至少n個值,則返回一個空集。拋出一個AssertionError,如果n是不是至少2

我想出了代碼:

def in_a_row(n,iterable): 
    assert n>=2, 'n has to at least 2' 

    result = set() 
    while any(iterable): 
     copy = iter(iterable) 
     for i in copy: 
      print(i) 
      if i == next(iterable): 
       result.add(i) 
     yield result 

但是,當我與測試用例測試:

print('Testing in_a_row') 
    print(in_a_row(2,[4,4,2,6,6,9,6,7,7,3,2,2])) 
    print(in_a_row(3,[5,3,7,7,7,2,3,8,5,4,4,4,6])) 
    print(in_a_row(4,[5,5,5])) 
    for i in range(5,1,-1): 
     print('for',i,'=',in_a_row(i,map(lambda x : x.rstrip(),open('in_a_row.txt')))) 

我把所有weirds導致可迭代對象:(+ _ +「)?

Testing in_a_row 
<generator object in_a_row at 0x02871AF8> 
<generator object in_a_row at 0x02871AF8> 
<generator object in_a_row at 0x02871AF8> 
for 5 = <generator object in_a_row at 0x028804B8> 
for 4 = <generator object in_a_row at 0x028804B8> 
for 3 = <generator object in_a_row at 0x028804B8> 
for 2 = <generator object in_a_row at 0x028804B8> 

假設是retrun號碼的設定()?

{4,6,7,2} 
{7,4} 
{} 
{'l', 'i'} 
{'l', 'i', 'c'} 
{'l', 'm', 'i', 'f', 'c', 'x', 'z'} 

不能使用任何BUIT的函數蟒蛇像「itertools」,只有while循環+ ITER +下一:(

+0

旁白:'而任何(迭代器)'檢查,看看是否有任何價值是真實的;例如,如果'iterable == [0,0,0]','any(iterable)'將會是False,所以循環不會被輸入。那真的是你想要的嗎? – DSM

回答

2

你屈服,每當一件物品,所以如果你想兌現它們在set,你不得不使用set,如:

print(set(in_a_row(2,[4,4,2,6,6,9,6,7,7,3,2,2]))) 
     ^^^ 

但是,您可以使用itertools.groupby大規模簡化功能,並返回一個set入手:

from itertools import groupby 
def in_a_row(n, iterable): 
    return {k for k, g in groupby(iterable) if len(list(g)) >= n} 

如果你想堅持在同一時間產生一個值,並把它們放在一個set後,那麼你可以做:

from itertools import groupby 
def in_a_row(n, iterable): 
    yield from (k for k, g in groupby(iterable) if len(list(g)) >= n) 
+0

感謝解決方案,但在這種情況下,我不能使用像「itertools」:( –

+0

@TrungNguyen任何插入功能的Python,堅持你的自定義函數,並使用'set(...)',然後... –

+0

CAn你告訴我嗎?我被困在如何使用set(...)上了嗎?!:( –