【问题标题】:most pythonic way to use a value from a list as an index to another list使用列表中的值作为另一个列表的索引的最 Pythonic 方式
【发布时间】:2015-09-13 21:37:01
【问题描述】:

我有一个列表hns = [[a,b,c],[c,b,a],[b,a,c]],其中的位置给出了特定样本中的排名。即hns[0] 运行1 hns[1] 运行`2,hns[2] 运行3,'a' 在运行1 中排名第1,在运行2 中排名第3,在运行3 中排名第2。

还有另一个列表hnday = [[a,1,2,3],[b,1,2,3],[c,1,2,3]]

所以在 hns 中,a 位于 0,0 位置,然后是 1,2 和 2,1,这在这个问题中意味着它的排名分别是 1 3 2,我需要最终得到一个反映这一点的表格

hnday = [[a,1,3,2],[b,2,2,1],[c,3,1,3]]

所以现在(因为我还是 python 新手,所以我仍然陷入 for 循环思考)在我看来,我必须循环遍历 hns 并填充 hnday,因为我要获取索引值,说 'a' = 1 并更新 hnday[0][1] = 1 hnday[0][2] = 3hnday[0][3] = 2

这似乎不是一个非常pythonic的方法来解决这个问题,我会问我可以看看其他方法。

【问题讨论】:

    标签: python list loops indexing


    【解决方案1】:

    这是我能想到的最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]
    

    【讨论】:

    • 哇,当我看到这种方法时,我明白我必须用这种优秀的语言走多远。在我接近这个之前,我有多年的苦力要卸掉。非常感谢您抽出宝贵的时间,并对投票感到抱歉,直到完成后我才看到您的评论。事实上,我不确定,但我可能无意中投了反对票,而这并不是我的本意。再次感谢您的回答
    • python 玩起来非常有趣。获取bpython 并获得双倍的乐趣! (并且学得更快)赞成票没关系,只是今天我不会获得任何声誉提升,因为我已经达到了 200 个限制:D
    【解决方案2】:

    我认为如果你这样做,你会得到更好的表现

    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]}
    

    【讨论】:

    • 感谢 Sudo,我会努力解决的,看看我的进展如何。当然非常清晰和精确,即使是像我这样的笨蛋也可以掌握这些代码。杰出的!!!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 2020-09-10
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    相关资源
    最近更新 更多