对第一个值的元组列表进行排序
我希望按每个元组中的第一个值对列表进行排序,但是我的代码不会生成任何实际的排序列表,尽管列表的顺序确实发生了变化。我的列表包含的元组的值为'PlayerCode',这是每个玩家的唯一键。而“平均点数”是玩家每场比赛得分的平均值。我希望按照“平均分数”对这份名单进行分类,尽管我似乎无法做到。这里是我的代码对第一个值的元组列表进行排序
def getKey(item):
return item[0]
def sortByPoints():
foundPlayers = []
with open ('PlayerList.csv') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
foundPlayers.append((row['Average PTS'], row['PlayerCode']))
print(foundPlayers)
sortedPlayers = sorted(foundPlayers, key = getKey)
print (sortedPlayers)
就像我说的,这确实改变了列表的顺序,但没有办法即时寻找,我也不能看到任何真正的模式,它已经将其改为到。 我使用蟒3.4
这里是两个列表
未排序的输出: [( '7', '1'),( '8', '2'),( '4' ('10','4'),('0','5'),('18','6'),('10','7'), ('''','8'),('10','9'),('2','10'),('4','11'), ('0','5'),('4','14'),('2','15')]
排序: [ ('10','9'),('18','6'),('2','10'),('2','12'), ('4','3'),('4','4'),('4','3'),('4','3'), ('8','2'),('9','8')]
问题是你有字符串,所以它按字母顺序排序。转换为整数:
foundPlayers.append((int(row['Average PTS']), int(row['PlayerCode'])))
row['Average PTS']
和row['Player Code']
返回字符串。 Python会比较字符串使用int
(可能)令人惊讶的结果
>>> '6' > '42'
True
转换row['Average PTS']
和row['Player Code']
。
可以使用itemgetter
从内置在模块进口operator
示例代码:
from operator import itemgetter
tuples = [(10, 3), (1, 4), (5, 4)]
sorted_tuples = sorted(tuples, key=itemgetter(0))
print(sorted_tuples)
输出:
[(1, 4), (5, 4), (10, 3)]
你可以使用lambda
功能键分类为:
sorted(my_list, key=lambda x: (int(x[1]), int(x[0])))
这里:
- 的
list
将基于在1
ST指数的内容进行排序。如果值相同,list
将根据0
th指数排序。 - 此外,您还需要将
tuple
中的值输入到int
。按排序按字典顺序排序。这意味着,对于字符串值,'11'会出现在'2'之前。
下面是示例例如:
>>> my_list = [('7', '1'), ('8', '2'), ('4', '3'), ('28', '4'), ('0', '5'), ('18', '6'), ('10', '7'), ('9', '8'), ('10', '9'), ('2', '10'), ('4', '11'), ('2', '12'), ('3', '13'), ('4', '14'), ('2', '15')]
>>> sorted(my_list, key=lambda x: (int(x[1]), int(x[0])))
[('7', '1'), ('8', '2'), ('4', '3'), ('28', '4'), ('0', '5'), ('18', '6'), ('10', '7'), ('9', '8'), ('10', '9'), ('2', '10'), ('4', '11'), ('2', '12'), ('3', '13'), ('4', '14'), ('2', '15')]
这里就是我的回答。我相信尽可能维护OP的原始代码,尽可能减少假设。如果要求有字符串呢?此外,尽可能减少额外进口。因此,我的解决办法是:
def sortByPoints():
foundPlayers = []
with open ('PlayerList.csv') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
foundPlayers.append((row['Average PTS'], row['PlayerCode']))
print(foundPlayers)
sortedPlayers = sorted(foundPlayers, key=lambda x: float(x[0]))
print(sortedPlayers)
去除冗余getKey
功能,并使用lambda
而不是为整洁。为了以后可能需要使用float
(因为您仅用于比较;使用int
仅限制您,并且与float
相比没有优势)。
我也相信在复制和粘贴代码;)
仅供参考,以改变方向:
sortedPlayers = sorted(foundPlayers, key=lambda x: float(x[0]), reverse=True)
还要注意的是,如果用意的确是只能为整数,那么你应该按照每个人的建议,并将您的元素转换为int
:
def sortByPoints():
foundPlayers = []
with open ('PlayerList.csv') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
foundPlayers.append((int(row['Average PTS']), int(row['PlayerCode'])))
print(foundPlayers)
sortedPlayers = sorted(foundPlayers, key=lambda x: x[0])
print(sortedPlayers)
请注意,按第一个v alue是元组的**默认排序**。除此之外,没有[mcve],目前还不清楚你的问题是什么。 – jonrsharpe
你想根据整数值进行排序,它们现在是字符串,所以你可以改变getKey函数来返回int(item [0]) – chatton
如果你真的想要,你可以使用字符串,只需排序使用'float' - 参见http://stackoverflow.com/a/17474264/2178980(实际上,上面的评论也可以做到这一点) – Eugene