2017-01-20 5 views
2

Я дал список, содержащий кортежиКак присвоить значение строке?

, например:

a=[('bp', 46), ('sugar', 98), ('fruc', 56), ('mom',65)] 

и вложенный список, в древовидной структуре

tree= [ 
    [ 
     'a', 
     'bp', 
     [78, 25, 453, 85, 96] 
    ], 
    [ 
     ['hi', ['no', ['ho', 'sugar', 3]], ['not', 'he', 20]], 
     [['$', 'fruc', 7185], 'might', 'old'], 
     'bye' 
    ], 
    [ 
     ['not', ['<', 'mom', 385]], 
     [ 
      ['in', 'Age', 78.5], 
      [['not', ['and', 'bp', 206]], 'life', [['or', ['not', ['\\', 'bp', 5]], ['p', 'sugar', 10]], 'ordag',[['perhaps', ['deal', 'mom', 79]], 
      'helloo',[['or', ['pl', 'mom', 25]], 'come', 'go']]]], 
      'noway' 
     ], 
     [['<', 'bp', 45], 'falseans', 'bye'] 
    ] 
] 

Как я могу назначить первый элемент кортежа, который представляет собой строку рядом с ней. Например, когда речь идет о «маме» в дереве, я хочу работать со своим значением. Я думал о создании словаря, но он только помещает мой список в другую форму, не помогает мне присваивать его значению в дереве. Вместо того, чтобы присваивать строке значение, я мог бы также работать с заменой строки своим значением, но замена функции работает только в строке и заменяет строку на другую.

Заранее благодарен

+0

Пожалуйста, покажите ожидаемый результат для примера данных – wwii

+0

'«\» 'не является действительной строкой питона. Ваш пример не летает. –

ответ

1

Быстрый взлом, работает в простых случаях.

(примечание: у вас есть неправильная строка здесь: '\' должна быть '\\')

  • преобразовать структуру в строку
  • выполнить замену, используя одиночные кавычки как разделитель, так что это безопасно против слов включений в других более крупные слова
  • проанализируйте строку с заменой с помощью ast.literal_eval, которая делает тяжелую работу (анализ корректного текста текстовой структуры до действительной структуры питона)

код:

tree= [['a', 'bp', [78, 25, 453, 85, 96]], 
[['hi', ['no', ['ho', 'sugar', 3]], ['not', 'he', 20]], 
[['$', 'fruc', 7185], 'might', 'old'], 
'bye'],[['not', ['<', 'mom', 385]], 
[['in', 'Age', 78.5],[['not', ['and', 'bp', 206]], 
'life',[['or', ['not', ['\\', 'bp', 5]], ['p', 'sugar', 10]], 
'ordag',[['perhaps', ['deal', 'mom', 79]], 
'helloo',[['or', ['pl', 'mom', 25]], 'come', 'go']]]], 
'noway'],[['<', 'bp', 45], 'falseans', 'bye']]] 
a=[('bp', 46), ('sugar', 98), ('fruc', 56), ('mom',65)] 

str_tree = str(tree) 

for before,after in a: 
    str_tree = str_tree.replace("'{}'".format(before),str(after)) 

new_tree = ast.literal_eval(str_tree) 
print(type(new_tree),new_tree) 

результат:

<class 'list'> [['a', 46, [78, 25, 453, 85, 96]], [['hi', ['no', ['ho', 98, 3]], ['not', 'he', 20]], [['$', 56, 7185], 'might', 'old'], 'bye'], [['not', ['<', 65, 385]], [['in', 'Age', 78.5], [['not', ['and', 46, 206]], 'life', [['or', ['not', ['\\', 46, 5]], ['p', 98, 10]], 'ordag', [['perhaps', ['deal', 65, 79]], 'helloo', [['or', ['pl', 65, 25]], 'come', 'go']]]], 'noway'], [['<', 46, 45], 'falseans', 'bye']]] 

Так что это хак, но он может обрабатывать данные, содержащие наборы, списки, словари, кортежи, не слишком много хлопот.

+0

Мне любопытно узнать, ищет ли это то, что ищет ОП. – wwii

+0

его довольно взломанный, но он мог работать ^^ – BloodyD

+0

Это действительно хакки. –

1

Я хотел бы предложить рекурсивное traversion дерева:

a=[('bp', 46), ('sugar', 98), ('fruc', 56), ('mom',65)] 
d = dict(a) 
tree= [ 
    [ 
     'a', 
     'bp', 
     [78, 25, 453, 85, 96] 
    ], 
    [ 
     ['hi', ['no', ['ho', 'sugar', 3]], ['not', 'he', 20]], 
     [['$', 'fruc', 7185], 'might', 'old'], 
     'bye' 
    ], 
    [ 
     ['not', ['<', 'mom', 385]], 
     [ 
      ['in', 'Age', 78.5], 
      [['not', ['and', 'bp', 206]], 'life', [['or', ['not', ['\\', 'bp', 5]], ['p', 'sugar', 10]], 'ordag',[['perhaps', ['deal', 'mom', 79]], 
      'helloo',[['or', ['pl', 'mom', 25]], 'come', 'go']]]], 
      'noway' 
     ], 
     [['<', 'bp', 45], 'falseans', 'bye'] 
    ] 
] 



def replace(node): 
    if isinstance(node, str): 
     return d.get(node, node) 
    elif isinstance(node, list): 
     return [replace(el) for el in node] 
    else: 
     return node 

replace(tree) 
+0

Спасибо, что он работает так, как я этого хочу :) – pengs

Смежные вопросы