我希望按每个元组中的第一个值对列表进行排序,但是我的代码不生成任何实际排序列表,尽管列表的顺序确实发生了变化。我的列表包含元组,其中包含' 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)
就像我说的,这确实改变了列表的顺序,但不是我想要的方式,也不能看到它改变它的任何真实模式。 我正在使用python 3.4
这是两个列表的输出
未排序: [(' 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') ]
排序方法: [(' 0',' 5'),(' 10',' 7'),(' 10' ,' 9'),(' 18',' 6'),(' 2',' 10') ,(' 2',' 12'),(' 2',' 15'),(' 28' ,' 4'),(' 3',' 13'),(' 4',' 3') ,(' 4',' 11'),(' 4',' 14'),(' 7' ,' 1'),(' 8',' 2'),(' 9',' 8') ]
答案 0 :(得分:0)
问题是你有字符串,所以它按字母顺序排序。转换为整数:
perl -nE '/\bn= (\d+).*\bperf= ([\d.]+)/ and say "$1 $2"' * > output
答案 1 :(得分:0)
row['Average PTS']
和row['Player Code']
返回字符串。 Python会将字符串与(可能)令人惊讶的结果进行比较
>>> '6' > '42'
True
使用row['Average PTS']
转换row['Player Code']
和int
。
答案 2 :(得分:0)
您可以使用从内置模块 func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
if let selectedRow = activityTableView.indexPathForSelectedRow {
updateCell(atIndexPath: selectedRow)
}
var rowActions = [UITableViewRowAction]()
....
return rowActions
}
itemgetter
示例代码:
operator
输出:
from operator import itemgetter
tuples = [(10, 3), (1, 4), (5, 4)]
sorted_tuples = sorted(tuples, key=itemgetter(0))
print(sorted_tuples)
答案 3 :(得分:0)
您可以使用lambda
函数作为键进行排序:
sorted(my_list, key=lambda x: (int(x[1]), int(x[0])))
下面:
list
将根据1
st索引的内容进行排序。如果值相同,list
将根据0
索引进行排序。 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')]
答案 4 :(得分:0)
这是我的答案。我相信尽可能保持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)