我可以操纵sorted()组织事物的方式吗?

时间:2015-08-07 05:05:51

标签: python sorting

我正在处理大量数据(元组列表),我想组织这些数据。更具体一点:

# my characters for the items in the strings are 1-9,a-e
# the results of my previous program produce a list of tuples
# e.g. ('string', int), where int is the count of occurrence of that string in my data
# my program currently lists them by count order, starting highest to lowest

>>> print results #results from the previous part of my code
[('7b7', 23522), ('dcd',23501)....('ccc',1)]

>>> for three_grams in results:
    print (sorted(three_grams))

[23522, '7b7']
[23501, 'dcd']
....
[1, 'ccc']

我不确定为什么要切换int和字符串...... 但我想以相反的方式对它们进行排序。理想情况下,

[('111',803), ('112', 2843), ('113', 10)....('fff', 12)]

有没有办法操纵sorted()函数的排序方式?我可以在元组的字符串位中按1-9a-e进行排序吗?

(另外,我以前用于生成这些结果的程序不打印计数为零的结果,我想要一些帮助。不确定我是否应该在此处发布或在我的整个代码中提出另一个讨论问题?什么是stackoverflow礼仪?我还是新的)

2 个答案:

答案 0 :(得分:6)

您正在对单个结果进行排序。

您需要对所有结果进行排序。

sorted可以使用key参数。来自the documentation

  

key指定一个参数的函数,用于从每个列表元素中提取比较键:key=str.lower。默认值为None(直接比较元素)。

我们将使用result[0]作为比较的关键,即'7b7''dcd''ccc'

>>> results = [('7b7', 23522), ('dcd',23501), ('ccc',1)]

>>> sorted(results, key=lambda result: result[0])
[('7b7', 23522), ('ccc', 1), ('dcd', 23501)]

如果您不喜欢lambda,可以使用itemgetter

>>> from operators import itemgetter
>>> sorted(results, key=itemgetter(0))
[('7b7', 23522), ('ccc', 1), ('dcd', 23501)]

答案 1 :(得分:0)

您可以像这样定义一个类似十六进制系统的字典(除了这是基数14):

valuesdict = {'a': 10, 'c': 12, 'b': 11, 'e': 14, 'd': 13, '1': 1, '3': 3, '2': 2, '5': 5, '4': 4, '7': 7, '6': 6, '9': 9, '8': 8}

添加一个函数,用于计算base 14系统中字符串的十进制值(基数为10)。

base = 14
def base10value(text):  

    count = len(text)-1
    finalValue = 0

    for character in text:
        number = valuesdict[character]
        finalValue += number*math.pow(base,count)
        count -= 1

    return finalValue

然后在元组列表中使用lambda函数

print sorted(tuple,key = lambda x: base10value(x[0]))