как указать индекс конкретных элементов в каждом подсписке вложенного списка? - PullRequest
2 голосов
/ 03 ноября 2019

У меня есть несколько вложенных списков, которые являются перестановками друг друга в подсписках:

x = [
['a', [['b', 'c', [['e', 'd']]]]],
['a', [['b', [['e', 'd']], 'c']]],
[[['b', 'c', [['e', 'd']]]], 'a'],
['a', [[[['d', 'e']], 'c', 'b']]]
]

Я хочу выбрать только те, которые соответствуют этому требованию: если подсписки содержат элемент 'd' в нем, он должен иметь индекс 0 в этом подсписке. Таким образом, среди списков в x нужно выбрать только

['a', [[[['d', 'e']], 'c', 'b']]]

. Я пробовал эту функцию:

def limitation(nested):
    result = []
    for i in nested:
        if isinstance(i, list):
            return limitation(i)
        else:
            if (i =='d' and nested.index(i) == 0):
                return nested

for i in x:
    print(limitation(i))


Но вывод ['d', 'e'] вместо ['a', [[[['d', 'e']], 'c',' b ']]]]. Как я могу это исправить?

Ответы [ 3 ]

1 голос
/ 03 ноября 2019

Вот альтернатива без необходимости каждый раз передавать корневой список.

def limitation(nested):
    for k, v in enumerate(nested):
        if isinstance(v, list):
            if limitation(v):
                return nested
        else:
            if (v == 'd' and k == 0):
                return nested

for i in x:
    if limitation(i):
        print(i)


0 голосов
/ 03 ноября 2019

Я новичок в python, и мой ответ немного многословен. Я уверен, что не очень хорошо использую язык Python, так как мне еще предстоит выучить все команды и опции. Это составляет строку разных размеров. Итак, подход новичка:

x = [
    ['a', [['b', [['e', 'd']], 'c']]],
    [[['b', 'c', [['e', 'd']]]], 'a'],
    ['a', [['b', 'c', [['e', 'dea']]]]],
    ['a', [[[['d', 'e']], 'c', 'b']]]
]

def ck(pl, dlevel, dstring, mystr):
    if (pl == dlevel) and (str("'"+dstring.strip()+"'") == mystr.strip()) :
        return "match"
    return ""

def dlimit(dlist, dlevel, dstring):
    pl = 0
    mystr = ""
    for xl in dlist:
        for i in str(xl):
            if i == "[" :
                mystr = ck(pl, dlevel, dstring, mystr)
                pl += 1
            elif i == "]" :
                mystr = ck(pl, dlevel, dstring, mystr)
                pl -= 1

            elif i == ',' :
                mystr = ck(pl, dlevel, dstring, mystr)
            else:
                mystr += i

            if mystr == 'match':
                print(xl)



print ('a',1)
dlimit(x, 1, 'a')

print ('\ndea',5)
dlimit(x, 5, 'dea')
0 голосов
/ 03 ноября 2019

Один из способов - всегда передавать элемент root вместе с nested.

x = [
    ['a', [['b', 'c', [['e', 'd']]]]],
    ['a', [['b', [['e', 'd']], 'c']]],
    [[['b', 'c', [['e', 'd']]]], 'a'],
    ['a', [[[['d', 'e']], 'c', 'b']]]
]

def limitation(root, nested, letter):
    result = []
    for i in nested:
        if isinstance(i, list):
            return limitation(root, i, letter)
        else:
            if (i == letter and nested.index(i) == 0):
                return root

result = list(filter(lambda a: a, [limitation(i, i, 'd') for i in x]))
print(result)

, который даст вам необходимый результат:

['a', [[[['d', 'e']], 'c', 'b']]]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...