如何对具有非数字值的字符串格式浮点数的列表进行排序?
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
我有一个这样的列表
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