如何从列表中删除带有破折号的整数,同时在对象中保留破折号

时间:2018-10-22 19:18:29

标签: python pandas list

我有一个包含以下字符串的列表:

trait SomeMix {

}

trait Processor[T] {

  def processMix(t: SomeMix) = {
    println("processing SomeMix")
  }

  def processAsUsual(t:T)= {
    println("processing T")
  }

  def process(t:T) = {
    t match {
      case mix: SomeMix => processMix(mix)
      case _ => processAsUsual(t)
    }
  }
}

我需要删除常规整数以及其中带有破折号的整数,同时保留名称和其中带有破折号的名称。到目前为止,我已经编写了以下代码:

此代码删除所有破折号(但是我如何仅指定从整数字符串而不是对象字符串中删除破折号):

    list1 = ['01', '02', '03', '04', 05', '101-1', '101-2', 101-3', 
    'Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']

此代码将删除所有用字符串包装的整数:

list2 = [i.replace('-','') for i in list1 if i.isdigit()]

使用上面的代码,我能够删除所有整数,但同时也删除了所有带有破折号的“名称”-我需要保留带有破折号的名称。我该怎么办?

3 个答案:

答案 0 :(得分:4)

(由于它被标记为熊猫),您可以使用str.replace + str.isdigit

s = pd.Series(list1)
s[~s.str.replace('-', '', regex=False).str.isdigit()]

8      Name1
9      Name2
10     Name3
11    Name-4
12    Name-5
13    Name-6
dtype: object

要返回列表,请在结果上调用.tolist()

将其转换为纯python,我们具有等效的列表comp(看起来不错,没有正则表达式):

>>> [x for x in list1 if not x.replace('-', '').isdigit()]
['Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']

答案 1 :(得分:2)

您可以使用正则表达式-匹配对象是真实的,None是虚假的。

import re
>>> list1 = ['01', '02', '03', '04', '05', '101-1', '101-2', '101-3', 
...:         'Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']
...:         
>>> [x for x in list1 if not re.match(r'\d+(-\d+)?$', x)]
>>> ['Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']

Demo on regex101.com

(Python代码中不需要^,因为re.match从字符串的开头搜索。)

答案 2 :(得分:1)

我将使用显式的for loop将{存储在变量reslist comprehension中。

import re
list1 = ['01', '02', '03', '04', '05', '101-1', '101-2', '101-3', 'Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']
res = []
for val in list1:
    if re.search('[a-zA-Z]', val):
        res.append(val)

如果我们打印res,我们会得到。

>>> res
>>> ['Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']

对于列表理解,我会这样做:

[val for val in list1 if re.search('[a-zA-Z]', val)]

>>> ['Name1', 'Name2', 'Name3', 'Name-4', 'Name-5', 'Name-6']