2017-12-12 4 views
0

私は反復不可能なデータコレクションを探しています。pythonでiterableではないリストまたはタプル

その理由は、複数の結果を新しいリストに追加してから「list.extend」関数を呼び出してマージするコードがあることです。

私はタプルを試しましたが、iterableです。イムできない組み込みのコレクションを探しています。

それが何をするか:

>>> t1 = tuple([1,2,3]) 
... t2 = tuple([4,5,6]) 
... l = list() 
... 
>>> l.extend(t1) 
>>> l.extend(t2) 
>>> 
>>> l 
[1, 2, 3, 4, 5, 6] 

iはLになりたいものです:

[(1,2,3), (4,5,6)] 

私はT1、T2の変数を変更することができます心の中で裸下さい....それが持っていますエクステンションを通過する。

+1

シングルトンタプルでラップするだけではなく、それを反復することができますか? e 1つのオブジェクト: 'return(wrapped、)' – Max

+0

コレクションオブジェクトから継承し、呼び出されるとクラッシュするメソッドをオーバーライドすることができます。それが現在不明であるため、入力/期待出力を投稿してください。 –

+0

@Max - iveは、あなたが提案したことをやっていると思います...それはうまくいきません。 – MajorInc

答えて

3

問題は、タプルが反復可能であるということではありません。タプルを反復不可能にすることは、反復不可能なリストを拡張するだけでは機能しないため、助けになりません。あなたがする必要がどのような

>>> l = [] 
>>> l.extend(1) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'int' object is not iterable 
>>> 

、リストにあなたのタプルをラップです:

>>> t1 = (1,2,3) 
>>> t2 = (4,5,6) 
>>> l.extend([t1]) 
>>> l.extend([t2]) 
>>> l 
[(1, 2, 3), (4, 5, 6)] 
>>> 

ます。また、同時に両方のタプルとリストを拡張することができます

>>> l.extend([t1,t2]) 
>>> l 
[(1, 2, 3), (4, 5, 6), (1, 2, 3), (4, 5, 6)] 
>>> 
2

あなたはリストの追加機能を使用できます。 -

>>> t1 = tuple([1,2,3]) 
>>> t2 = tuple([4,5,6]) 
>>> l = list() 
>>> l.append(t1) 
>>> l.append(t2) 
>>> l # [(1,2,3), (4,5,6)] 
+0

拡張機能を使用する必要があります – MajorInc

0

あなたはタプルがパラメータとして渡されるので、もし、それが代わりに拡張を追加し、上書きextend__iadd__方法でlistの子クラスを作成することができます。

class MyList(list): 
    def __fake_extend(self,other): 
     if isinstance(other,tuple): 
      self.append(other) 
     else: 
      list.extend(self,other) 

    def __iadd__(self,other): 
     self.__fake_extend(other) 
     return self 
    def extend(self,other): 
     self.__fake_extend(other) 

t1 = (1,2,3) 
t2 = (4,5,6) 

l = MyList() 

l.extend(t1) 
l.extend(t2) 
l.extend([4,2,4,5]) 
print(l) 

結果:

[(1, 2, 3), (4, 5, 6), 4, 2, 4, 5] 

タプルをリストの項目も追加されました(tupleではないリストに含まれていたので)

関連する問題