在Python中对数字和字母的组合列表进行排序

时间:2016-09-02 10:17:18

标签: python list python-2.7 sorting

我试图在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。有什么想法吗?

3 个答案:

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