Как заменить некоторые символы из списка кортежей - PullRequest
1 голос
/ 28 апреля 2019

У меня есть этот список кортежей (POS-тег), и мне нужно изменить некоторые символы, только если они находятся во втором элементе или кортеже:

Например:

x = [('We', 'PRP'), ("'re", 'VBP'), ('really', 'RB$'), ('sorry', 'JJ'), ('...', ':')]

Мне нужно изменить «странный» символ второго элемента, в этом примере: RB $ и:.

Я пробовал:

x_2[x.index(':')] = 'Dts'

и

x_2[x_2.index[,('$')]] = 'S'

Я ожидаю этот вывод:

x_2 = [('We', 'PRP'), ("'re", 'VBP'), ('really', 'RBS'), ('sorry', 'JJ'), ('...', 'Dts')]

Заранее спасибо и извините, если это действительно базовый вопрос, я довольно плохо знаком с Python.

Ответы [ 5 ]

1 голос
/ 28 апреля 2019

Вы можете использовать таблицу перевода. В Python 3 вы можете использовать метод maketrans из класса str:

change = str.maketrans({"$": "S", ":": "Dts"})

Что позволяет сопоставить значения в строке с таблицей перевода, вызвав translate:

[(i, j.translate(change)) for i,j in x]
# [('We', 'PRP'), ("'re", 'VBP'), ('really', 'RBS'), ('sorry', 'JJ'), ('...', 'Dts')]
1 голос
/ 28 апреля 2019

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

to_change = {
    ':': 'Dts', 
    'RB$': 'RBS'
}

и затем изменить их

x_2 = [(f, to_change.get(s, s)) for f,s in x]
0 голосов
/ 28 апреля 2019

Во-первых, важно понимать, что кортежи неизменны, и вы не должны пытаться изменять их содержимое.Рекомендуется преобразовать x в подобный dict, чтобы вы могли изменять значения dict, потому что в Python эти переменные являются изменяемыми.

In [36]: y = dict(x)

In [37]: y
Out[37]: {'We': 'PRP', "'re": 'VBP', 'really': 'RB$', 'sorry': 'JJ'}

Теперь вы можете хранить все символы в переменнойи искать их в диктанте y.Когда символ найден, просто замените его на '' нулевое значение.

In [38]: symbols = '$:;?'
In [39]: for k,v in y.items():
    ...:     for symbol in symbols:
    ...:         if symbol in v:
    ...:             v = v.translate({ord(symbol):''})
    ...:             y[k] = v

In [40]: y
Out[40]: {'We': 'PRP', "'re": 'VBP', 'really': 'RB', 'sorry': 'JJ'}

Давайте добавим еще один элемент к y со специальным символом, определенным в symbols:

In [41]: y['test'] = 'ZZ;'

In [42]: y
Out[42]: {'We': 'PRP', "'re": 'VBP', 'really': 'RB', 'sorry': 'JJ', 'test': 'ZZ;'}

Итак, если я заключу вышеприведенный код цикла в функцию modify_dict и вызову, значение элемента test также будет изменено:

In [45]: modify_dict()

In [46]: y
Out[46]: {'We': 'PRP', "'re": 'VBP', 'really': 'RB', 'sorry': 'JJ', 'test': 'ZZ'}

Чтобы преобразовать его обратно в списоккортежей:

In [55]: z = [(k,v) for k,v in y.items()]

In [56]: z
Out[56]:
[('We', 'PRP'),
 ("'re", 'VBP'),
 ('really', 'RB'),
 ('sorry', 'JJ'),
 ('test', 'ZZ')]
0 голосов
/ 28 апреля 2019

один способ сделать это:

a, b = zip(*x) # unzip into two lists
b = list(b) # make b a list, not a tuple, in order to be mutable

'''
change values
'''
b[b.index(':')] = 'Dts'
b[b.index[,('$')]] = 'S'

x = list(zip(a,b)) # zip back into an original looking list
0 голосов
/ 28 апреля 2019

Попробуйте это:

x1 = [(i,j.replace('$','S').replace(':','Dts')) for i,j in x]

ВЫХОД :

[('We', 'PRP'), ("'re", 'VBP'), ('really', 'RBS'), ('sorry', 'JJ'), ('...', 'Dts')]
...