24

私は(私の知る限り)配列を分割してそれらを結合し、さらには itertools を使用してすべてを試しました:

import itertools

def oneDArray(x):
    return list(itertools.chain(*x))

私が望む結果:

a)print oneDArray([1,[2,2,2],4]) == [1,2,2,2,4]

奇妙なことに、それは

b)print oneDArray([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) == [1, 2, 3, 4, 5, 6, 7, 8, 9]

質問 1) パーツ a を希望どおりに動作させるにはどうすればよいですか (何かヒントはありますか?)

質問 2) 上記の次のコードがパート a ではなくパート b で機能するのはなぜですか??

4

14 に答える 14

17

を使用している場合python < 3は、次のことができます。

from compiler.ast import flatten
list = [1,[2,2,2],4]
print flatten(list)

Python 3.0 での同等のマニュアルは次のようになります (この回答から取得):

def flatten(x):
    result = []
    for el in x:
        if hasattr(el, "__iter__") and not isinstance(el, str):
            result.extend(flatten(el))
        else:
            result.append(el)
    return result

 print(flatten(["junk",["nested stuff"],[],[[]]]))  

リスト内包表記でも同じことができます:

list = [1,[2,2,2],4]
l = [item for sublist in list for item in sublist]

これは次と同等です:

l = [[1], [2], [3], [4], [5]]
result = []
for sublist in l:
    for item in sublist:
        result.append(item)

print(result)
于 2013-07-05T10:38:41.940 に答える
10

Python でネストされたリストから単一のリストを作成するには、次のように簡単に実行できます。

from functools import reduce

some_list = [[14], [215, 383, 87], [298], [374], [2,3,4,5,6,7]]
single_list = reduce(lambda x,y: x+y, some_list)
print(single_list)

出力: [14, 215, 383, 87, 298, 374, 2, 3, 4, 5, 6, 7]

于 2019-02-01T12:22:50.727 に答える
6
from nltk import flatten

example_list = [1, [2, 3], 3]
flattened_list = flatten(example_list)
print(flattened_list)

出力: [1, 2, 3, 3]

于 2019-11-28T06:13:26.687 に答える
1

を使用する必要はありませんappend。ただ使うextend

def flatten(nasted_list):
    """
    input: nasted_list - this contain any number of nested lists.
    ------------------------
    output: list_of_lists - one list contain all the items.
    """

    list_of_lists = []
    for item in nasted_list:
        list_of_lists.extend(item)
    return list_of_lists

test1 = flatten([[1,2,3],[4,5,6]])
print(test1)

出力: [1, 2, 3, 4, 5, 6]

于 2020-07-29T11:26:58.503 に答える
0

こちらをご覧ください: http://caolanmcmahon.com/posts/flatten_for_python/ http://rightfootin.blogspot.de/2006/09/more-on-python-flatten.html

于 2013-07-05T10:42:46.720 に答える
0

実際には itertools を使用しなくても非常に簡単です。リストを単純に反復でき、ループが別のリストに遭遇した場合は、ネストされたリストを単純に反復します。コードは次のとおりです。

def flatten(l):
    flatList = []
    for elem in l:
        # if an element of a list is a list
        # iterate over this list and add elements to flatList 
        if type(elem) == list:
            for e in elem:
                flatList.append(e)
        else:
            flatList.append(elem)
    return flatList


a = [1,[2,2,2],4]  # flatten(a) returns [1, 2, 2, 2, 4]
b =  [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # flatten(b) returns [1, 2, 3, 4, 5, 6, 7, 8, 9]
于 2013-07-05T09:58:13.133 に答える
0

リストのリストの 1 レベルのみになる場合、最も簡単な解決策は次のとおりです。

lis = [1,[2,2,2],"456"]
output = []
for item in lis:
    if isinstance(item, (str, int, bool)):
        output.append(item)
    elif isinstance(item, dict):
        for i in item.items():
            output.extend(i)
    else:
        output.extend(list(item))

extend(list(item)) を使用した理由は、アイテム内にセットがあっても問題が発生しないためです。これは、アイテムを文字列、整数、ブール値、辞書、リスト、およびタプルとして処理します。

于 2013-07-05T10:34:05.367 に答える