我试图在Python中对列表进行排序,但在同一个术语中包含字母和数字。在字符串上使用sort的问题是它没有正确排序数字:
2
23
3
等
list = [("a", ['8', '0']), ("a", ['7', '0b']), ("a", ['7', '0']), ("a", ['6', '0b']), ("a", ['6', '01']]
new_list = sorted(list, key=lambda i: i[1])
# works great on ints.
字母需要按等号排序,即:
a = 1, b = 2, c = 3, d = 4 etc
因此4.1a
== 4.11
但我需要保留输出中的字母,而不是将其转换为int。有什么想法吗?
答案 0 :(得分:0)
这是我的解决方案:
def f(s):
m = {'a': 1,'b': 2,'c': 3,'d': 4,'e': 5,
'f': 6,'g': 7,'h': 8,'i': 9,'j': 10,
'k': 11,'l': 12,'m': 13,'n': 14,'o': 15,
'p': 16,'q': 17,'r': 18,'s': 19,
't': 20,'u': 21,'v': 22,'w': 23,
'x': 24,'y': 25,'z': 26}
result = []
for l in s:
try:
result.append(int(l))
except ValueError:
result.append(m[l])
return result
list = [("a", ['8', '0']), ("a", ['7', '0b']), ("a", ['7', '0']), ("a", ['6', '0b']), ("a", ['6', '01'])]
new_list = sorted(list, key=lambda i: f(''.join(i[1])))
>>> new_list
[('a', ['6', '01']),
('a', ['6', '0b']),
('a', ['7', '0']),
('a', ['7', '0b']),
('a', ['8', '0'])]
该功能会转换类似' 60b'到[6,0,2](字母在映射字典后转换为整数。然后lambda根据返回的列表进行排序。
答案 1 :(得分:0)
你的问题并不完全清楚,但我认为你忽略了每个元组中的第一个项目,而只是在第二个项目的列表中排序。我还假设只有从'a'到'i'的字母可以出现在该列表中。
转换 - >的简单方法1,b - > 2,c - > 3,... i - >图9的实施例是利用数字字符的ASCII码是连续的并且小写字母也是连续的这一事实。因此,每个字母与其等效数字之间的偏移量为48。
因此,要将字符串列表转换为键,我们可以将所有字符串连接成单个字符串,然后将字符串中的每个字母char转换为其等效的数字字符,将生成的字符串联回单个字符串,然后转换该字符串为整数。
lst = [
("a", ['8', '0']),
("a", ['7', '0b']),
("a", ['7', '0']),
("a", ['6', '0b']),
("a", ['6', '01']),
]
def keyfunc(t):
a = [chr(ord(c) - 48) if 'a' <= c <= 'i' else c for c in ''.join(t[1])]
return int(''.join(a))
new_lst = sorted(lst, key=keyfunc)
for row in new_lst:
print(row)
<强>输出强>
('a', ['7', '0'])
('a', ['8', '0'])
('a', ['6', '01'])
('a', ['6', '0b'])
('a', ['7', '0b'])
顺便说一句,你不应该使用list
作为变量名,因为这会影响内置的list
类型,这会导致神秘的错误。
答案 2 :(得分:0)
您是在进行增量排序还是仅按a1
元素进行排序?
如果你真的需要获得一个字母的数字值,你可以使用
string.ascii_letters.index(letter)
或者甚至更好,如果你只需要连续的字母数字,a&lt; = b,
使用ord(letter)
。
但我认为字母应该正确排序而不需要获得整数值。我认为问题是分裂['a', 'a1']
。
我不确定这是否是您所需要的:
def sort_func(item):
try:
return item[1][1][1]
except:
return item[1][1]
# sort by the alphanumeric
vals.sort(key=sort_func)
# sort again by the number
vals.sort(key=lambda i: int(i[1][0]))
# sort again by the first letter
vals.sort(key=lambda i:i[0])