所以我有一个List[List[str]]
,其中有以下字符串:
UGLY_DATA = [
['4', 'Total=64 (1)=10;(2)=19;(3)=21;(4)=12;'],
['1', 'Total=16 (1)=16;']
]
我需要按以下方式对其进行排序:
[[12.0, 19.0, 21.0, 12.0], [16.0]]
我一直在尝试将for
,.strip()
与.split()
循环一起使用,但是没有成功,您知道如何以正确的方式对其进行排序吗?我不允许使用模块
编辑:
我正在重写这个问题;所以我有一个List[list]
:
[[4, 'Total=64 (1)=12;(2)=19;(3)=21;(4)=12;'], [1, 'Total=16 (1)=16;']]
我正在尝试从str
和[0][1]
的{{1}}中提取数据:并以以下方式返回列表:
[1][1]
这意味着我需要从每个[[12.0, 19.0, 21.0, 12.0], [16.0]]
中删除Total=x
和(x)=
(示例中x可以是任何数字)。
答案 0 :(得分:1)
尽管正则表达式可能更健壮,但您使用'split'的方向正确。假设您的数据是一致的:
编辑:根据您的评论,您想返回浮点数列表:
UGLY_DATA = [
['4', 'Total=64 (1)=10;(2)=19;(3)=21;(4)=12;'],
['1', 'Total=16 (1)=16;']
]
def getNumerics(row):
relevant_element = row[1]
# split after '=' and remove Total=64
split = relevant_element.split("=")[2:] # ['10;(2)', '19;(3)', '21;(4)', '12;']
# for each item in list: get text before ';' and convert to float
cleaned = [float(x.split(";")[0]) for x in split]
return cleaned
# return a new list containing lists of floats
cleaned_data = [getNumerics(row) for row in UGLY_DATA]
print(cleaned_data) # [[10.0, 19.0, 21.0, 12.0], [16.0]]
答案 1 :(得分:0)
使用正则表达式提取这些值,您可以执行以下操作:
import re
# util function to get the string from an inner list
get_s = lambda lst: next(x for x in lst if isinstance(x, str) and x.startswith('Total='))
# util to turn that string into a list of floats
nums = lambda s: list(map(float, re.findall(r'\(\d+\)=(\d+(?:\.\d+)?)', s)))
clean_data = [nums(get_s(x)) for x in UGLY_DATA]
# [[12.0, 19.0, 21.0, 12.0]
# [12.2, 18.0, 18.0, 12.2]
# [16.0]]
或者不使用re
模块,仅使用str.split
:
nums = lambda s: list(map(float, (f.split('=')[1] for f in s.split()[1].split(';')[:-1])))
答案 2 :(得分:0)
正则表达式是关键:
import re
data = [ 4, 'Total=64 (1)=12;(2)=19;(3)=21;(4)=12;',]
s = [re.findall(re.compile('=(\d+);'),da) for da in data if isinstance(da,str)][0]
print(s)
现在您需要一个可以对所有行执行此操作的函数:)