入れ子のリストをPythonで単一のリストに変換する方法は?[閉まっている]


7

ID番号を含むリストがあります。リストの一部の要素は別のリストです。ネストされたリストを単一のリストに変換するために、collectionsモジュールを使用して再帰関数を記述します。

私のコードは以下の通りです。

from collections import Iterable
def single_list(list):
for item in list:
    if isinstance(item, Iterable):
        yield from single_list(item)
    else:
        yield item

Item_list = [10,20,[30,40],[50,'Null',70],100]
items_single=single_list(Item_list)
for item in items_single:
print(item)

プログラムを実行すると、次のエラーメッセージが表示されます。

  Traceback (most recent call last):
  File "/Research/SoftDev/SEPJ/StackOverflow_qs.py", line 42, in <module>
  for i in items_single:
  File "/Research/SoftDev/SEPJ/StackOverflow_qs.py", line 36, in single_list
  yield from single_list(item)
  File "/Research/SoftDev/SEPJ/StackOverflow_qs.py", line 36, in single_list
  yield from single_list(item)
  File "/Research/SoftDev/SEPJ/StackOverflow_qs.py", line 36, in single_list
  yield from single_list(item)
  [Previous line repeated 986 more times]
  File "/Research/SoftDev/SEPJ/StackOverflow_qs.py", line 35, in single_list
  if isinstance(item, Iterable):
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/abc.py", line 184, in __instancecheck__
if subclass in cls._abc_cache:
  File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/_weakrefset.py", line 75, in __contains__
return wr in self.data
 RecursionError: maximum recursion depth exceeded in comparison

 Process finished with exit code 1

エラーの修正方法がわかりません。


これはデータサイエンスの問題ではないため、終了するかStackOverflowに移動する必要があります。mpu.datastructures.flatten(yourlist)問題の解決策として参照してください。実装も確認できます。
Martin Thoma

回答:


7

ネストされたリストに文字列値が含まれているため、エラーが発生します。文字列値も処理する必要があります。

次のコードでエラーを修正できます。

from collections import Iterable

def single_list(list,ignore_types=(str)): 
for item in list:
    if isinstance(item, Iterable) and not isinstance(item, ignore_types):
        yield from single_list(item,ignore_types=(str))
    else:
        yield item

Item_list = [10,20,[30,40],[50,'Null',70],100]
items_single=single_list(Item_list)
for item in items_single:
    print(item)

お役に立てて嬉しいです。
Rejaul Karim、2018

2

あなたの質問はリストのフラット化に焦点を当てています。この質問はStackOverflowでよく回答されています。Pythonのリストのリストからフラットリスト作成するをご覧ください。

それが最良の答えではないかもしれませんが、ここにそのスレッドに関する私の独自の答えがあります。

最近、次のようなサブリストに文字列と数値データが混在する状況に遭遇しました

test = ['591212948',
['special', 'assoc', 'of', 'Chicago', 'Jon', 'Doe'],
['Jon'],
['Doe'],
['fl'],
92001,
555555555,
'hello',
['hello2', 'a'],
'b',
['hello33', ['z', 'w'], 'b']]

などのメソッドが機能しflat_list = [item for sublist in test for item in sublist]ていない場合。それで、私は1+レベルのサブリストのために次の解決策を思いつきました

def flattenList(data):
    results = []
    for rec in data:
        if isinstance(rec, list):
            results.extend(rec)
            results = flattenList(results)
        else:
            results.append(rec)
    return results

そしてその結果

In [38]: flattenList(test)
Out[38]:
 Out[60]:
['591212948',
'special',
'assoc',
'of',
'Chicago',
'Jon',
'Doe',
'Jon',
'Doe',
'fl',
92001,
555555555,
'hello',
'hello2',
'a',
'b',
'hello33',
'z',
'w',
'b']

0

以下の方法を試すことができます。nested_list =変換したいリストです。

コード:

flat_list = [item for sublist in nested_list for item in sublist]

上記のコードは以下と同じです:

for sublist in nested_list:
    for item in sublist:
        flat_list.append(item)

ありがとう!


ご協力ありがとうございました。ただし、TypeErrorのようなエラーメッセージが表示されます: 'int'オブジェクトはソリューションから反復可能ではありません。
Younus Ali 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.