从列表中提取数据的最佳方法

时间:2018-11-04 20:14:05

标签: python python-3.x

所以我有一个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可以是任何数字)。

3 个答案:

答案 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)

现在您需要一个可以对所有行执行此操作的函数:)