我有一个大型数组,我想对其进行排序。在数组中,数组中的第一项是类别,第二项是需要排序的项。例如:
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个独立的数组并基本上对这些数据进行排序)。我现在主要关心的是分配数据的最佳方法是什么。
答案 0 :(得分:4)
我猜你想要的东西是:
new_joe = sorted( joe,key = lambda x: x[1] )
与效率略高一样:
from operator import itemgetter
new_joe = sorted( joe, key = itemgetter(1) )
或者,您可以对joe
进行排序:
joe.sort(key=lambda x: x[1])
但是,如果您希望将所有'miles'
列表放在一起,然后在此之后按升序排序,该怎么办?
joe.sort()
应该做的伎俩...(现在,希望我已经覆盖了足够的基础,我点击了你需要的那个。)
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)
但另一种选择是对joe
进行排序(例如joe.sort()
)并使用itertools.groupby
。
答案 1 :(得分: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])
要对每个列表进行排序,您可以迭代dict的值并使用列表的sort
方法对它们进行排序:
for category in my_dict:
my_dict[category].sort()
这会给你一个my_dict
看起来像:
{'trophy': ['explorer'], 'miles': [330, 400], 'points': [4000, 4100, 5000]}
答案 2 :(得分: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()
这有帮助吗?