Python: модифицировать строки, хранящиеся в различных объектах, в цикле - PullRequest
0 голосов
/ 24 августа 2011

У меня есть строки, хранящиеся в различных объектах, например, a, b, c [2: 7] (т.е. 5 различных строк c [2], ... c [6]), ds, es [:] (т.е.все строки хранятся в списке es).Мне нужно перебрать все эти строки в разных местах кода и изменить эти переменные в циклах.(Присвоение измененных строк новым переменным не будет работать, поскольку есть другие функции, ожидающие изменения строк в исходных переменных.) Как я могу эффективно сделать это в Python?

Если бы я мог создать список ссылок нато строки, которые я мог бы просто всегда перебирать:

str_ref_lst=[reference(a), reference(b), reference(d.s)]
str_ref_lst.extend[reference(c[2:7])]
str_ref_lst.extend[reference(e.s[:])]
...
for ref_strng in str_ref_lst:
  do_string_modifications1(dereference(ref_strng))
...
function_using_the_modified_variables1()
...
for ref_strng in str_ref_lst:
  do_string_modifications2(dereference(ref_strng))
...
function_using_the_modified_variables2()
etc

Однако я не знаю аналогов () / dereference () в Python (и я полагаю, что это не будет правильным способом в Pythonв любом случае)

Ответы [ 4 ]

1 голос
/ 24 августа 2011

Рекомендуемый ответ должен быть "использовать словарь", но если у вас есть , чтобы сделать это таким образом:

class cls(object):
    pass

a = "<a>"
b = "<b>"
c = ["", "", "<c>"]
d = cls()
d.s = "<d.s>"
e = cls()
e.s = "<e.s>"

var_list = "a b c[2:7] d.s e.s".split()

for var in var_list:
    exec "%s+='Mod'" % var             # Modify the variables

print a,b,c,d.s,e.s
# >>> <a>Mod <b>Mod ['', '', '<c>', 'M', 'o', 'd'] <d.s>Mod <e.s>Mod

IIRC этот способ не работает в Python 3.0, потому чтовнутренних оптимизаций

С ломтиками это должно быть примерно так:

import re

class cls(object):
    pass

def fn(var):      # function to apply to the strings
    return "[%s mod]" % var

a = "<a>"
b = "<b>"
c = "01234567890"
d = cls()
d.s = "<d.s>"
e = cls()
e.s = "<e.s>"

var_list = "a b c[2:7] d.s e.s".split()

for var in var_list:
    # Modify the variables
    try:
        # exec "%s='Hi there'" % var             # Modify the variables
        exec "%(var)s=fn(%(var)s)" % { "var": var }
    except TypeError:
        # Assume Slice...
        slice_ = re.findall("\[(\d+)\:(\d+)\]", var)[0]   # Get slice
        var_with_slice = var
        var = var.split("[")[0]                 # Remove slice
        # Look ma, I can code in Perl too! :)
        line = \
             "%(var)s=%(var)s[:%(slice1)s]+fn(%(var_with_slice)s)+%(var)s[%(slice2)s+1:]" % \
             { "var": var, "var_with_slice": var_with_slice, "slice1": slice_[0], "slice2": slice_[1] }
        # somewhat like c = c[:2] + fn(c[2:7]) + c[7+1:]
        exec line

print a,b,c,d.s,e.s
# >>> [<a> mod] [<b> mod] 01[23456 mod]890 [<d.s> mod] [<e.s> mod]
1 голос
/ 24 августа 2011

Ваши функции do_string_modifications необходимо изменить, чтобы они возвращали новое строковое значение вместо попытки изменить его на месте (поскольку это невозможно). Используйте ваши новые функции для изменения списка и переназначьте исходные строковые ссылки на новые значения в списке после изменения (при необходимости):

str_lst = [a, b, d.s, c[2:7], e.s]
str_lst = [do_string_modifications1(x) for x in str_lst]
str_lst = [do_string_modifications2(x) for x in str_lst]
a, b, d.s, c[2:7], e.s = str_lst
0 голосов
/ 24 августа 2011

Это невозможно в той общности, которую вы хотите. Самым большим препятствием являются операции срезов, которые вы дали, c[2:7] и e.s[:]. Эти выражения не являются lvalues, вы не можете присвоить им. Они просто генерируют новые строковые значения, которые вы должны захватить, или они пропали.

Если у вас только что были lvalue (a, b, d.s), выражения, которые вы можете присвоить, вы могли бы придумать что-то, но с помощью c [2: 7] и e.s [:] это невозможно.

0 голосов
/ 24 августа 2011

Вы могли бы сделать что-то вроде этого.

def stringMod(inStr):
  return inStr.replace('f', 'g')

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