如何替换元组列表中的某些字符

时间:2019-04-28 17:44:58

标签: python list replace tuples

我有此元组列表(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 个答案:

答案 0 :(得分:1)

我不确定为什么应该更改这样的字符串,所以我不知道更改它们的逻辑,但是我只会保留需要更改内容的字典(除非有不同的逻辑并且除了此示例外,还需要更改更多的字符串)

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

然后更改它们

x_2 = [(f, to_change.get(s, s)) for f,s in x]

答案 1 :(得分:1)

您可以使用翻译表。在Python 3中,您可以使用str类中的maketrans方法:

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

通过调用translate,您可以通过转换表将字符串中的值映射到转换表:

[(i, j.translate(change)) for i,j in x]
# [('We', 'PRP'), ("'re", 'VBP'), ('really', 'RBS'), ('sorry', 'JJ'), ('...', 'Dts')]

答案 2 :(得分:0)

尝试一下:

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

输出

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

答案 3 :(得分:0)

一种方法:

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

答案 4 :(得分:0)

首先,重要的是要了解元组是不可变的,并且您不应尝试修改其内容。建议将x转换成这样的dict,以便您可以修改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;'}

因此,如果我将上述for循环代码放在函数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')]