0

nltk.tree.ParentedTreeのインスタンスを使用していますが、質問はそれよりも一般的だと思います。

基本的に、任意の深さのネストのリストがあり、リストの一部を削除したいと思います(ただし、その部分がどれほど深くネストされているかはわかりません)。searchリスト内のアイテムの出現を検出する関数があります。これは、整数のタプルを返します。nここnで、は検出された要素の深さです。

たとえば、私が持っていると言うと、それl = [[['cat', 'dog']], ['fish']]を呼び出すsearch(l, 'dog')と、が返されます(0, 0, 1)。これは私にそれを言っていl[0][0][1] == 'dog'ます。'dog'事前にそれが発生していることを知っていれば(0, 0, 1)、を実行するだけでリストから削除できdel l[0][0][1]ます。しかし、事前にそれを知らないので、プログラムで同じようなことをする必要があります。

'dog'リスト内の要素にアクセスするには、

indices = search(l, 'dog')
for i in indices:
    l = l[i]

だから今lです'dog'。しかし、そこからリストから削除する方法がわかりません。に設定したいだけではありませんNone

4

2 に答える 2

3

最後の参照を除くすべてをループしてから、最後の参照を使用してアイテムを削除できます。

obj = l
for index in indices[:-1]:
    obj = obj[index]
del obj[indices[-1]]

最後のインデックスを除くすべてを使用することで、参照されたアイテムのへの参照を解決したので、最後のインデックスで削除できるようになりました。

于 2012-12-07T17:45:56.603 に答える
1

試す:

del reduce(lambda cur, ind: cur[ind], index_list[:-1], l)[index_list[-1]]

これは、@Martijn Pietersが彼の答えで示唆していることを正確に行うための、より洗練された方法です。

于 2012-12-07T17:47:03.493 に答える