0

我有一个大数组,我想对其进行排序。在数组中,数组中的第一项是类别,第二项是需要排序的项。例如:

joe = [['miles', 330], ['points', 5000], ['miles', 400], ['points', 4000], ['trophy', 'explorer'], ['points', 4100]]

我一直在尝试不同的方法来访问列表中的列表,但我不确定如何准确地做到这一点。我怎样才能访问这些信息?

我尝试了以下变化:

mylist = []
for item in joe:
    category = mylist(item[0])
    print category

之后我会将这些值分配给不同的数组(我应该有 3 个单独的数组并对这些数据进行排序)。不过,我现在主要关心的是分配数据的最佳方式是什么。

4

3 回答 3

4

I'm guessing you want something like:

new_joe = sorted( joe,key = lambda x: x[1] )

which is the same thing as the slightly more efficient:

from operator import itemgetter
new_joe = sorted( joe, key = itemgetter(1) )

Or, you can sort joe in place:

joe.sort(key=lambda x: x[1])

But, what if you want to have all of the 'miles' lists together, and then sorted in ascending order after that?

joe.sort()

should do the trick ... (and now, hopefully I've covered enough bases that I hit the one you need).


Ahh, Now I see what you want. For this, you have a bunch of options. My favorite is a collections.defaultdict:

from collections import defaultdict
d = defaultdict(list)
for k,v in joe:
   d[k].append(v)

for k,v in d.items():
   print(k,v)

But another options would be to sort joe (e.g. joe.sort()) and use itertools.groupby.

于 2012-09-25T01:55:37.043 回答
1

要将数据分成每个类别的列表,字典将帮助您 - 它可以将单个字符串与数字列表相关联。因此,从将所有类别与空列表相关联的 dict 开始 -my_dict = {'miles': [], 'points': []}等等,然后遍历列表 - 在每个项目中,您希望将数字附加到与字符串关联的列表中:

for item in joe:
    category = item[0]
    my_dict[category].append(item[1])

您可以避免使用 dict 的setdefault方法对所有要放入 dict 的类别进行硬编码(或预计算):

my_dict = {}
for item in joe:
   category = item[0]
   my_dict.setdefault(category, []).append(item[1])

然后对这些列表中的每一个进行排序,您可以迭代字典的值并使用列表的sort方法对它们进行排序:

for category in my_dict:
   my_dict[category].sort()

这会给你一个my_dict看起来像:

{'trophy': ['explorer'], 'miles': [330, 400], 'points': [4000, 4100, 5000]}
于 2012-09-25T01:59:57.180 回答
1

当您执行此循环时:

for item in joe:

item看起来像什么?无需猜测,您可以打印它:

for item in joe:
    print item

显然,item是主列表中的每个子列表,第一个是['miles', 330].

现在你怎么得到'miles'item[0], 正确的? item[1]将是330

现在,您可以轻松地根据类别构建新列表。我们会将这些存储在字典中。

joedict = {}
for item in joe:
    joedict.setdefault(item[0], []).append(item[1])

现在joedict['miles']是所有里程的列表等等。

对这些中的每一个进行排序很简单:

for value in joedict.itervalues():
    value.sort()

这有帮助吗?

于 2012-09-25T02:01:13.053 回答