如何从列表中删除所有非数字字符串字符?

时间:2019-11-07 16:55:18

标签: python

我有一个列表,希望从中删除所有非数字字符串值。

list = ['$\\mathdefault{10}$', '$\\mathdefault{30}$', '$\\mathdefault{50}$']

将成为:

newlist = [10,30,50]

我尝试过:

>> [x for x in mylist if not isinstance(x, str)]
>> [x for x in mylist if isinstance(x, int)]
>> [x for x in mylist if isinstance(x, float)]

全部返回空:[]大概是因为即使数字都是字符串。

如何实现:[10,30,50]

7 个答案:

答案 0 :(得分:2)

newlist = [int(''.join(char for char in string if char.isdigit())) for string in mylist]

您实际上正在做一些事情,这就是为什么您会得到这种粗糙的1-衬里的原因。列表中的每个项目都需要去除所有非数字字符。这就是char.isdigit()部分。然后,其余数字字符串字符需要连接在一起。这就是''.join(...)部分。然后,需要将它们转换为int(...)部分的int值。并且所有这些都包含在列表推导中,因此您最终得到一个整数列表。

>> [x for x in mylist if not isinstance(x, str)]
>> [x for x in mylist if isinstance(x, int)]
>> [x for x in mylist if isinstance(x, float)]

这些都不起作用的原因是因为它们作用于列表中的整个字符串,而不是作用于每个字符串中的字符。同样,即使它们是数字字符,它们仍然是字符串。因此isinstance()不会将它们与字母和其他字符分开。

答案 1 :(得分:1)

使用正则表达式

list = ['$\\mathdefault{10}$', '$\\mathdefault{30}$', '$\\mathdefault{50}$']

import re
array = [int(re.findall(r'[0-9]+', i)[0]) for i in list]

print(array)
[10, 30, 50]

答案 2 :(得分:1)

mylist = ['$\\mathdefault{10}$', '$\\mathdefault{30}$', '$\\mathdefault{50}$']

result = [int(''.join(i for i in x if i.isdigit())) for x in mylist]

输出:

[10, 30, 50]

说明:

result = [             # 6. list comprehension to build the resulting ints
  int(                 # 5. convert to int
    ''.join(           # 4. concatenate the matched digit strings
      i for i in x     # 2. loop through each character in x
      if i.isdigit()   # 3. check if character (i) is a digit (0-9)
    )
  )
  for x in mylist      # 1. loop through each string in mylist
]

答案 3 :(得分:1)

my_list = ['$\\mathdefault{10}$', '$\\mathdefault{30}$', '$\\mathdefault{50}$']
import string
def parse_digits(text):
    return int(''.join([char for char in text if char in string.digits]))
ml = [parse_digits(item) for item in my_list]

答案 4 :(得分:1)

import re
listInput = ['$\\mathdefault{10}$', '$\\mathdefault{30}$', '$\\mathdefault{50}$']
newlist = []

for i in listInput:

    numbers = re.findall('[0-9]+', i)
    if(len(numbers) > 0):
        newlist.append(int(numbers[0]))

print(newlist)

https://pythonexamples.org/python-regex-extract-find-all-the-numbers-in-string/

答案 5 :(得分:1)

这是解决问题的最快捷方法:

myList = ['$\\mathdefault{10}$', '$\\mathdefault{30}$', '$\\mathdefault{50}$']
onlyTheNumbers = list(map(lambda y: int("".join([z for z in y if z.isnumeric()])), myList))
print(onlyTheNumbers)
# output: [10, 30, 50]

答案 6 :(得分:1)

如果所有字符串都具有相同模式$\\mathdefault{number}$,则可以使用切片:

[int(i[14:-2]) for i in lst]
# [10, 30, 50]

或者,您可以使用正则表达式:

import re

p = re.compile(r'\d+')
[int(p.search(i).group(0)) for i in lst]
# [10, 30, 50]