Как заменить все значения (функцией) во вложенном списке в Python? - PullRequest
0 голосов
/ 08 февраля 2019

Есть много предложений, но я не могу их придерживаться.Ближайшее решение у меня есть ниже.Данные имеют вид:

my_list = ([1, [2, 3], 4, [5, [6 , [], [8, 9]], 10]], 8)

и функция

def convert(G, l, d):
    z = []
    if isinstance(x, list):
        print(x)
        z.append(convert(G, x, d))
    else:
        print(x)
        z.append([v[d] for n,v in G.nodes(data=True) if n == l])
    return z

выполнение:

print(convert(G, my_list, "name"))

Это дает пустой массив, но print (x) получает источник какявляется.Я близко, я думаю.Проблема в том, что я не знаю, как передать l в if n == l как целое число, а не список.

РЕДАКТИРОВАТЬ

Outpit: (['a', ['b', 'c'], 'd', ['e', ['f' , [], ['g', 'h']], 'j']], 'g) втот же формат (вложенный).Пользовательская функция просто берет каждый элемент (int) и возвращает его атрибут из dict (letter).

Еще одна попытка:

my_list = ([1, [2, 3], 4, [5, [6 , [], [8, 9]], 10]], 8)
z = []
def convert(G, l, d):
    z.append([convert(G, x, d) if isinstance(x, list) else [v[d] for n,v in G.nodes(data=True) if n == x]])
    return z

z = convert(G, my_`list, "name")
print(z)

Эта часть является пользовательской функцией:

[v[d] for n,v in G.nodes(data=True) if n == l]

, поэтому G может быть любым.Вы можете принять это как [...]

Например: G.nodes = {0: {'name': 'a'}, 1: {'name': 'b'}, 2: {'name': 'c'}, 3: {'name': 'd'}}

Ответы [ 4 ]

0 голосов
/ 08 февраля 2019

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

def v(x):
    return x + 1

def convert(l):
    z = []
    for x in l:
        if isinstance(x, list):
            z.append(convert(x))
        else:
            z.append(v(x))
    return z

Это приводит к ожидаемому вложению:

>>> convert([[1, [2, 3], 4, [5, [6 , [], [8, 9]], 10]], 8])
[[2, [3, 4], 5, [6, [7, [], [9, 10]], 11]], 9]
0 голосов
/ 08 февраля 2019

Определить пользовательский маппер

import string
def mapper(item):
    if not isinstance(item,list):
        return d[item]
    else:
        return [mapper(i) for i in item]

d=dict(zip(range(1, len(string.ascii_lowercase) + 1), string.ascii_lowercase))

Диктовка отображения будет выглядеть следующим образом

{1: 'a', 2: 'b', 3: 'c',4: «d», 5: «e», 6: «f», 7: «g», 8: «h», 9: «i», 10: «j», 11: «k», 12:'l', 13: 'm', 14: 'n', 15: 'o', 16: 'p', 17: 'q', 18: 'r', 19: 's', 20: 't', 21:' u ', 22:' v ', 23:' w ', 24:' x ', 25:' y ', 26:' z '}

my_list = ([1, [2, 3], 4, [5, [6 , [], [8, 9]], 10]], 8)
tuple([mapper(i) for i in my_list])

Вы также можете использовать функцию map с пользовательским преобразователем

tuple(map(mapper,my_list))

Выход

(['a', ['b', 'c'], 'd', ['e', ['f', [], ['h', 'i']], 'j']], 'h')
0 голосов
/ 08 февраля 2019

Вам просто нужно сделать рекурсивную функцию для преобразования:

my_list = ([1, [2, 3], 4, [5, [6 , [], [8, 9]], 10]], 8)
mapping = {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 6: 'f', 7: 'g', 8: 'h', 9: 'i', 10: 'j'}

def convert(inlist):
    def transform(x):
        if isinstance(x, list):
            return convert(x)
        else:
            return mapping.get(x)
    return [transform(x) for x in inlist]
print(convert(my_list))
0 голосов
/ 08 февраля 2019

Похоже, вы ищете некую функцию map, которая работает для вложенных списков.Попробуйте это:

def deepmap(f, lst):
    return [deepmap(f, x) if isinstance(x, list) else f(x) for x in lst]

Это преобразует внешний tuple в другой list.Если вам нужно, чтобы это был кортеж, или если внутри может быть больше кортежей, не должно быть слишком сложно расширить эту функцию соответствующим образом.Пример:

>>> my_list = ([1, [2, 3], 4, [5, [6 , [], [8, 9]], 10]], 8)
>>> deepmap(str, my_list)
[['1', ['2', '3'], '4', ['5', ['6', [], ['8', '9']], '10']], '8']

В вашем случае функция отображения f может выглядеть примерно так, хотя и не совсем уверена.(Возможно, вы также захотите изменить структуру данных G.nodes, чтобы вам не приходилось повторять все элементы, но вы могли бы напрямую обращаться к элементу x.)

f = lambda x: next(v[d] for n,v in G.nodes(data=True) if n == x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...