我有一个列表,希望从中删除所有非数字字符串值。
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]
?
答案 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]