使用列表中的值作为另一个列表的索引的最pythonic方式
most pythonic way to use a value from a list as an index to another list
我有一个列表 hns = [[a,b,c],[c,b,a],[b,a,c]]
,其中的位置给出了特定样本中的排名。即 hns[0]
是 运行 1
hns[1]
是 运行 `2 并且 hns[2] 是 运行 3 并且 'a' 被排名运行 1 名 运行 1 名 2 运行 2 名 3.
和另一个列表hnday = [[a,1,2,3],[b,1,2,3],[c,1,2,3]]
所以在 hns 中 a 位于 0,0 位置然后是 1,2 和 2,1 这在这个问题中意味着它的排名分别是 1 3 2 我需要以 table 反映了
hnday = [[a,1,3,2],[b,2,2,1],[c,3,1,3]]
所以现在(因为我仍然陷入循环思考,因为我是 python 的新手)在我看来,我必须遍历 hns
并填充 hnday
当我取索引值时,说 'a' = 1 并更新 hnday[0][1] = 1
hnday[0][2] = 3
和 hnday[0][3] = 2
这似乎不是一个非常 pythonic 的方法来解决这个问题,我会问我可以看看还有什么其他方法。
这是我能想到的最pythonic最漂亮的方式:
>>> hns=[['a','b','c'],['c','b','a'],['b','a','c']]
>>> keys = ['a','b','c']
>>> hnday = [[k]+[hns[i].index(k)+1 for i in range(len(hns))] for k in keys]
[['a', 1, 3, 2], ['b', 2, 2, 1], ['c', 3, 1, 3]]
不过,最后一个表达式,字典好像不是最合适的?
使用字典,您可以使用 hnday[key]
轻松访问键的排名,而不是迭代 hnday
.
在理解表达式上变化不大:
>>> hnday = {k:[hns[i].index(k)+1 for i in range(len(hns))] for k in keys}
{'c': [3, 1, 3], 'b': [2, 2, 1], 'a': [1, 3, 2]}
>>> hnday['a']
[1, 3, 2]
>>> hnday['b']
[2, 2, 1]
>>> hnday['c']
[3, 1, 3]
我认为如果你这样做,你会获得更好的表现
hns = [['a','b','c'],['c','b','a'],['b','a','c']]
M={}
for x in hns:
for i,y in enumerate(x):
if y in M:
M[y].append(i+1)
else:
M[y]=[i+1]
print M
# {'a': [1, 3, 2], 'c': [3, 1, 3], 'b': [2, 2, 1]}
我有一个列表 hns = [[a,b,c],[c,b,a],[b,a,c]]
,其中的位置给出了特定样本中的排名。即 hns[0]
是 运行 1
hns[1]
是 运行 `2 并且 hns[2] 是 运行 3 并且 'a' 被排名运行 1 名 运行 1 名 2 运行 2 名 3.
和另一个列表hnday = [[a,1,2,3],[b,1,2,3],[c,1,2,3]]
所以在 hns 中 a 位于 0,0 位置然后是 1,2 和 2,1 这在这个问题中意味着它的排名分别是 1 3 2 我需要以 table 反映了
hnday = [[a,1,3,2],[b,2,2,1],[c,3,1,3]]
所以现在(因为我仍然陷入循环思考,因为我是 python 的新手)在我看来,我必须遍历 hns
并填充 hnday
当我取索引值时,说 'a' = 1 并更新 hnday[0][1] = 1
hnday[0][2] = 3
和 hnday[0][3] = 2
这似乎不是一个非常 pythonic 的方法来解决这个问题,我会问我可以看看还有什么其他方法。
这是我能想到的最pythonic最漂亮的方式:
>>> hns=[['a','b','c'],['c','b','a'],['b','a','c']]
>>> keys = ['a','b','c']
>>> hnday = [[k]+[hns[i].index(k)+1 for i in range(len(hns))] for k in keys]
[['a', 1, 3, 2], ['b', 2, 2, 1], ['c', 3, 1, 3]]
不过,最后一个表达式,字典好像不是最合适的?
使用字典,您可以使用 hnday[key]
轻松访问键的排名,而不是迭代 hnday
.
在理解表达式上变化不大:
>>> hnday = {k:[hns[i].index(k)+1 for i in range(len(hns))] for k in keys}
{'c': [3, 1, 3], 'b': [2, 2, 1], 'a': [1, 3, 2]}
>>> hnday['a']
[1, 3, 2]
>>> hnday['b']
[2, 2, 1]
>>> hnday['c']
[3, 1, 3]
我认为如果你这样做,你会获得更好的表现
hns = [['a','b','c'],['c','b','a'],['b','a','c']]
M={}
for x in hns:
for i,y in enumerate(x):
if y in M:
M[y].append(i+1)
else:
M[y]=[i+1]
print M
# {'a': [1, 3, 2], 'c': [3, 1, 3], 'b': [2, 2, 1]}