【问题标题】:How to replace some characters of a list of tuples如何替换元组列表的某些字符
【发布时间】:2019-09-17 11:09:40
【问题描述】:

我有这个元组列表(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 很陌生。

【问题讨论】:

  • ':' 映射到'Dts' 的逻辑是什么?它背后是否有一些逻辑或您需要硬编码的任意规则集?
  • 您的代码将x 定义为元组列表,但随后引用x_2x_2 是什么?
  • 没有逻辑,它是随机的。 x_2 是尝试更改 x 中的字符。

标签: python list replace tuples


【解决方案1】:

我不确定为什么应该更改此类字符串,因此我不知道更改它们的逻辑,但我会保留需要更改的字典(除非有不同的逻辑除了这个例子之外,还有更多的字符串需要更改)

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

然后改变它们

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

【讨论】:

    【解决方案2】:

    试试这个:

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

    输出

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

    【讨论】:

      【解决方案3】:

      一种方法:

      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
      

      【讨论】:

      • x1 = [(i,j.replace('$','S').replace(':','Dts')) for i,j in x] 相比,这种方法的优势在于使用二分搜索.index 运算符,它的工作时间为O(log n)。
      • .index 是线性搜索。 b.index[,('$')] 也是无效的语法。另外,请考虑编辑您的问题而不是发表评论。
      • 是的,你是对的:) 感谢您指出这一点。以后会做的
      【解决方案4】:

      您可以使用转换表。在 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')]
      

      【讨论】:

        【解决方案5】:

        首先,重要的是要了解元组是不可变的,您不应尝试修改其内容。推荐将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'}
        

        让我们用symbols中定义的特殊符号向y添加另一个项目:

        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')]
        

        【讨论】:

          猜你喜欢
          • 2014-10-09
          • 2023-03-04
          • 1970-01-01
          • 2015-09-16
          • 2021-07-16
          • 2012-03-30
          • 2018-03-25
          • 2019-03-04
          • 2012-07-01
          相关资源
          最近更新 更多