从字典中创建新列表,该字典根据其值

时间:2018-05-29 14:10:31

标签: python python-2.7

编辑:

正如有人提到评论,词典没有订单,所以在这种情况下这个问题没有意义。

我需要做的是根据存储在另一个列表中的索引值来设置一个列表项的顺序。

例如

  

a = [橙子,苹果,桃子,西瓜,口香糖]

     

b = [3,4,1,2,0]

在这种情况下,我想获取存储在列表b中每个索引中的值,然后根据列表b中的值将列表a中的相应索引移动到新索引。

因此,如果重新排序上面的例子,结果将是:

  

a = [口香糖,桃子,西瓜,橘子,苹果]

由于列表b中的第一项是' 3'我需要将列表a中的相应第一个值(在这种情况下为' oranges')移动到列表的索引位置,因此它移动到位置3.因为' 0'是列表的最后一个元素' b'它对应于列表中的最后一个元素' a' (在这种情况下' gum'),所以列表的最后一个元素' a'应该移动到索引位置0,如上所述。

我们可以假设列表b将具有与列表a相同的元素长度,并且索引值将仅在允许的范围内(如果我们有5个项目则从0-4开始),因此尽管有助于解决的解决方案这将是有趣的,这种情况不需要它。

我有一本字典,说:

a = {0:3, 1:2, 2:1,3:0}

我想创建一个列表,将字典的键放在字典值中指定的位置,换句话说输出应该是这种情况:

b = [3, 2, 1, 0]

或者如果你有:

a = {0: 1, 1: 0, 2: 4, 3: 3, 4: 2}

b应该是:

b = [1, 0, 4, 3, 2]

我读过将函数传递给排序列表方法,但我不确定它究竟需要什么。

<击>

3 个答案:

答案 0 :(得分:0)

使用列表理解来实现它的一种有效方法是:

res = [d.get(i, 0) for i in range(max(d) + 1)]

将缺少的索引\键的列表值设置为0。

<强>实施例

>> d = {0:1, 1:0, 2:4, 3:3, 4:2}
>> res = [d.get(i, 0) for i in range(max(d) + 1)]
>> res
[1, 0, 4, 3, 2]
>> d = {0:1, 4:2}  # index location 1, 2 & 3 is missing!
>> res = [d.get(i, 0) for i in range(max(d) + 1)]
>> res
[1, 0, 0, 0, 2]

答案 1 :(得分:0)

如果索引是连续的,您可以使用列表理解获取列表。

  

如果您对答案不满意或者您正在寻找更多功能,请发表评论。

     

注意:不要忘记看示例3.1&amp; 3.2因为这些都集中在问题的主要部分。

根据您提供的输入尝试以下2个代码示例。

»示例1

a = {0:3, 1:2, 2:1,3:0}
b = [a[value] for value in sorted(a.values()) ]
print(b) # [3, 2, 1, 0]

»示例2

a= {0:1,1:0,2:4,3:3,4:2}
b = [a[value] for value in sorted(a.values()) ]
print(b) # [1, 0, 4, 3, 2]

现在让我们关注另一个问题。

  

我们有2个列表 a b 。我们必须根据列表 b 中提供的索引重新排列列表 a 的项目。

»示例3.1 - 整数列表

a = [10, 21, 52, 63, 74]
b = [3, 2, 4, 1, 0]
d = {} # d = dict()

for indx, value in enumerate(b):
    if(indx != value):
        if indx in d:
            d[value] = a[value]
            a[b[indx]] = d[indx]
            del d[indx]
        else:
            d[value] = a[value]
            a[value] = a[indx]

 print (a) # [74, 63, 21, 10, 52]

示例3.2 - 字符串列表

a = ["orange", "apple", "peach", "watermelon", "gum"]
b = [3, 4, 1, 2, 0]
d = dict() # d = {}

for indx, value in enumerate(b):
    if(indx != value):
        if indx in d:
            d[value] = a[value]
            a[b[indx]] = d[indx]
            del d[indx]
        else:
            d[value] = a[value]
            a[value] = a[indx]

print (a) # ['gum', 'peach', 'watermelon', 'orange', 'apple']

答案 2 :(得分:0)

创建一个具有最大值的空列表,以便它不会给出索引错误:

a = {0: 1, 1: 0, 2: 4, 3: 3, 4: 2}

values=[0]*(max(a.values())+1)

for i in a:
    values[a[i]]=i

输出:

[1, 0, 4, 3, 2]