Python:对列表进行排序

Python:对列表进行排序,python,list,sorting,Python,List,Sorting,我想对数组c进行排序。但是我没有得到答案a,b,c,d。相反,我得到了a,b,d,c。我能做些什么,对整个数组而不仅仅是一行进行排序 编辑:我想对数字进行排序。和连接的字母,应该有相同的顺序像排序的数字。对不起,我的问题不清楚。也许我应该先加入数字和字母。这样地: [a',1][b',2] a = ['a','b','d','c'] b = [1,2,4,3] c = [[],[]] c[0]=a c[1]=b c[1].sort() print(c) 让我们看看这里发生了什么: # Init

我想对数组c进行排序。但是我没有得到答案a,b,c,d。相反,我得到了a,b,d,c。我能做些什么,对整个数组而不仅仅是一行进行排序

编辑:我想对数字进行排序。和连接的字母,应该有相同的顺序像排序的数字。对不起,我的问题不清楚。也许我应该先加入数字和字母。这样地: [a',1][b',2]

a = ['a','b','d','c']
b = [1,2,4,3]
c = [[],[]]
c[0]=a
c[1]=b
c[1].sort()
print(c)

让我们看看这里发生了什么:

# Initialize the lists
a = ['a','b','d','c']
b = [1,2,4,3]
c = [[],[]]

# Assign the lists to positions in c
c[0]=a
c[1]=b

# Sort b, which was assigned to c[1]
c[1].sort()
print(c)
因此,您当然不能期望
a
得到排序。请尝试以下方法:

# Sort a, which was assigned to c[0]
c[0].sort()

# Sort b, which was assigned to c[1]
c[1].sort()
print(c)
或者如果
c
长度可变:

# Sort every list in c
for l in c:
    l.sort()
编辑:作为对您的评论的回应,字母与数字之间没有任何连接。如果您想让它们连接起来,您需要将它们连接到一个类似元组的结构中。请尝试:

>>> c = [ (1, 'a'), (2, 'b'), (4, 'd'), (3, 'c') ]
>>> c.sort()
>>> print c 
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]

默认情况下,元组将按其第一个元素排序。请注意,您可以在此处使用任何字母来代替a、b、c、d,元组的排序仍然相同(按数字)。

这似乎是您真正想要做的:

>>> a = ['a', 'z', 'd', 'c']
>>> b = [1,   2,   4,   3]
>>> c = zip(a, b)
>>> c
[('a', 1), ('z', 2), ('d', 4), ('c', 3)]
>>> import operator
>>> c.sort(key=operator.itemgetter(1))
# this would be equivalent: c.sort(key=lambda x: x[1])
>>> c
[('a', 1), ('z', 2), ('c', 3), ('d', 4)]

在Python中,一个
数组
(您正在使用的排序)被称为
list
。至于您的问题,请将
c[1].sort()
更改为
c[0].sort()
,您的字符串列表将被排序,而不是c[1]中包含的整数列表.

我想到的第一件事是使用numpy数组,而不是内置的
列表
数据类型

比如:

>>> from numpy import *
>>> a = array(['a', 'b', 'd', 'c'])
>>> a.sort()
>>> print a
['a' 'b' 'c' 'd']
>>> reshape(a, (2,2))
array([['a', 'b'],
       ['c', 'd']], 
      dtype='|S1')
印刷品

['a', 'b', 'c', 'd']

罗杰·佩特给了一个很好的回答,但是你说“但是现在他把字母分类了。我想把数字分类。”

这是Roger Pate答案的一个修改版本,它按数字对c进行排序。这是你想要的吗

>>> def mykey(tup):
>>>     return tup[1]
>>>
>>> a = ['a','b','d','c']
>>> b = [1, 2, 4, 3]
>>> c = zip(a, b)
>>> c
[('a', 1), ('b', 2), ('d', 4), ('c', 3)]
>>> c.sort(key=mykey)
>>> c
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

sort()
方法函数的“键”是一个函数。该函数返回要使用的键。
mykey()
函数获取一个元组并返回其第二个值(值由1索引)。因此,
.sort()
将使用元组的数字部分进行排序。字符串仍将与数字匹配。您甚至可以再次拆分列表
c
,以恢复列表
a
b
,它们仍将匹配。

您必须提供自定义比较函数以供排序使用。使用lambda非常简单:


cmp = lambda x,y: (x[1], x[0]) < (y[1], y[0])
L.sort(cmp = cmp)
Lambda是一个完全匿名的函数,在本例中,它颠倒了元素的顺序,使得第二个元素成为主键,并使用“进行比较,您可以尝试(对于Python 3.x):

这将根据b中的值返回排序后的a

a = ['a','b','d','c']
b = [1,2,4,3]

print(sort_a_based_on_b(a,b))

打印
['a','b','c','d']

这就是你想要的吗

>>> a = ['a','b','d','c']
>>> b = [1, 2, 4, 3]
>>> c = zip(b, a)
>>> c.sort()
>>> c = [(y, x) for (x, y) in c]
>>> print(c)
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

您是否试图根据
b
中的相应值对
a
进行排序?因为您想要实现的目标似乎有些混乱,我建议添加一个您期望的输出示例。您是否试图根据c[1]中的值对数组c[0]进行排序?是的,我正在尝试根据b中的相应值对a进行排序。对不起,您应该对c[0]进行排序,而不是对c[1]进行排序但是现在他对字母进行了排序。我想对数字进行排序。kame:很抱歉,现在已经解决了;我看到你也对问题进行了编辑,以澄清这一点。:)当然,它是这样的。它只是不像你想象的那样工作。它返回一个包含排序列表的新列表。好的,但我想对数字进行排序。以及连接的字母。应该有顺序和数字一样。对不起,我的问题不清楚。请看上面,我得到了解决方案,但我想对数字进行排序。--数组-->列表!好吧,我想danben的答案现在已经解决了:)。我只是指出了数组与列表的关系,因为在Python中使用了术语数组来描述另一个不太灵活但速度更快的问题,container()。现在我明白了问题所在。也许我应该首先将数字和字母连接起来。当我对数字排序时,连接的字母也应该连接起来。我认为这对于这个问题来说有点过分了。

cmp = lambda x,y: (x[1], x[0]) < (y[1], y[0])
L.sort(cmp = cmp)
def sort_a_based_on_b(a, b):
    c = sorted(list(zip(b, a)))
    return list(list(zip(*c))[1]) # Returns the sorted a
a = ['a','b','d','c']
b = [1,2,4,3]

print(sort_a_based_on_b(a,b))
>>> a = ['a','b','d','c']
>>> b = [1, 2, 4, 3]
>>> c = zip(b, a)
>>> c.sort()
>>> c = [(y, x) for (x, y) in c]
>>> print(c)
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]