如何对具有非数字值的字符串格式浮点数的列表进行排序?

How can I sort a list that has a float in string format with a non-numeric value?

我有一个这样的列表

data = [('£3.46', 'I001'), ('£10.46', 'I002')] 

我想用

对这个列表进行排序
data.sort()

但是排序列表将 10.46 英镑放在 3.46 英镑之前,我假设这是因为数据是一个字符串,而 1 英镑在 3 英镑之前。
我试过查看 lambda 函数,但我无法理解它。

一个选项是剥离 "£" 并将数字转换为浮点数作为排序键:

data.sort(key=lambda x: float(x[0].lstrip('£')))
print(data)

输出:

[('£3.46', 'I001'), ('£10.46', 'I002')]

这是一种通用方法,有一些局限性,但应该适用于各种类似情况。

import re

def float_then_text(values):
    '''Convert [str, str, ...] to [(float, str), (float, str), ...]'''
    return [(float(re.sub(r'[^\d.]+', '', text)), text) for
for text in values]

data = [('£3.46', 'I001'), ('£10.46', 'I002')]

data.sort(key=float_then_text)

函数float_then_text将从('£3.46', 'I001')转换为[(3.46, '£3.46'), (1.0, 'I001')]等等。

在键中包含文本是可选的,但要确保具有不同单位的值每次都以相同的顺序排序。

您可以通过这种简单的方式实现:

data = [('£10.46', 'I002'), ('£3.46', 'I001')]
def sort_tuple(item):
    return float(item[0][1:])

print(sorted(data, key=sort_tuple))

输出:

[('£3.46', 'I001'), ('£10.46', 'I002')]

Process finished with exit code 0