2

次のようなリストがあるとします。

li = ['0', ['1', '2'], ['3', ['4', '5'], '6', ['7'], '8'], '9']

次の形式でタプルを生成する関数を実装するにはどうすればよいですか(elem, indexes)

  • elem要素です
  • indexesその要素に到達するために必要なインデックスです。

例:

>>> for x in my_func(li):
    print x
('0', [0])
('1', [1, 0])
('2', [1, 1])
('3', [2, 0])
('4', [2, 1, 0])
('5', [2, 1, 1])
('6', [2, 2])
('7', [2, 3, 0])
('8', [2, 4])
('9', [3])
4

3 に答える 3

5

ここにネストされたバージョンがあります

li = ['0', ['1', '2'], ['3', ['4', '5'], '6', ['7'], '8'], '9']
def to_int(lst, path=[]):
    for i, j in enumerate(lst):
        if isinstance(j, list):
            yield list(to_int(j, path+[i]))
        else:
            yield int(j), path+[i]

print(list(to_int(li)))

フラット化されたバージョン (Python3.3+)

li = ['0', ['1', '2'], ['3', ['4', '5'], '6', ['7'], '8'], '9']
def to_int(lst, path=[]):
    for i, j in enumerate(lst):
        if isinstance(j, list):
            yield from to_int(j, path+[i])
        else:
            yield int(j), path+[i]

for item in to_int(li):
    print (item)

使えない場合yield from(< Python3.3)は、このように面倒な書き方をしなければなりません

li = ['0', ['1', '2'], ['3', ['4', '5'], '6', ['7'], '8'], '9']
def to_int(lst, path=[]):
    for i, j in enumerate(lst):
        if isinstance(j, list):
            for item in to_int(j, path+[i]): yield item
        else:
            yield int(j), path+[i]

for item in to_int(li):
    print (item)

通常、空のリストをデフォルトのパラメーターとして使用することはお勧めできませんが、ここでは変更しないように注意しているので問題ありません。

于 2013-04-04T10:02:34.080 に答える
1
def nextedindex(lst, indice=tuple()):
    for index, data in enumerate(lst):
        if isinstance(data, collections.Sequence):
            for next in nestedindex(data, indice + (index,)): yield next
        else:
            yield indice + (index,), data
于 2013-04-04T10:05:48.220 に答える
1

単純な再帰バージョン。

これは、リストの各レベルを再帰的にループし、インデックス パスを追跡して現在のループに到達しますcurrentIndex

def indexRecursive(alist, currentIndex, tuples):
    i = 0
    for item in alist:
        if type(item) != list:
           tuples.append((item, currentIndex + [i]))
        else:
            indexRecursive(alist[i], currentIndex + [i], tuples)
        i += 1

li = ['0', ['1', '2'], ['3', ['4', '5'], '6', ['7'], '8'], '9']
tuplesList = []
indexRecursive(li, [], tuplesList)
print tuplesList
于 2013-04-04T10:13:20.923 に答える