首页 > 解决方案 > 自定义排序后从 2 个列表创建一个新列表

问题描述

我有 2 个ordereddict 列表,我通过一个函数从数据库中获取它们,它们如下所示

首先列出打印输出:

OrderedDict([('Items', '1'), ('Itemspaid', 'Rutr'), ('First', 'Het'), ('Second', 'Fru'), ('Third', 'yurn'), ('Flip', 223.513353868968)])
OrderedDict([('Items', '2'), ('Itemspaid', 'Rutr'), ('First', 'Het'), ('Second', 'Fru'), ('Third', 'yurn'), ('Flip', 243.513353868968)])
OrderedDict([('Items', '3'), ('Itemspaid', 'Rutr'), ('First', 'Het'), ('Second', 'Fru'), ('Third', 'yurn'), ('Flip', 263.513353868968)])
OrderedDict([('Items', '4'), ('Itemspaid', 'Rutr'), ('First', 'Het'), ('Second', 'Fru'), ('Third', 'yurn'), ('Flip', 323.513353868968)])
OrderedDict([('Items', '5'), ('Itemspaid', 'Rutr'), ('First', 'Het'), ('Second', 'Fru'), ('Third', 'yurn'), ('Flip', 333.513353868968)])
OrderedDict([('Items', '6'), ('Itemspaid', 'Rutr'), ('First', 'Het'), ('Second', 'Fru'), ('Third', 'yurn'), ('Flip', 343.513353868968)])
OrderedDict([('Items', '7'), ('Itemspaid', 'Rutr'), ('First', 'Het'), ('Second', 'Fru'), ('Third', 'yurn'), ('Flip', 353.513353868968)])
OrderedDict([('Items', '8'), ('Itemspaid', 'Rutr'), ('First', 'Het'), ('Second', 'Fru'), ('Third', 'yurn'), ('Flip', 13.513353868968)])
OrderedDict([('Items', '9'), ('Itemspaid', 'Rutr'), ('First', 'Het'), ('Second', 'Fru'), ('Third', 'yurn'), ('Flip', 123.513353868968)])
OrderedDict([('Items', '10'), ('Itemspaid', 'Rutr'), ('First', 'Het'), ('Second', 'Fru'), ('Third', 'yurn'), ('Flip', 162.513353868968)])
OrderedDict([('Items', '11'), ('Itemspaid', 'Rutr'), ('First', 'Het'), ('Second', 'Fru'), ('Third', 'yurn'), ('Flip', 213.513353868968)])

第二个列表打印输出:

OrderedDict([('planneditems', '1'), ('plannedItemspaid', 'pRutr'), ('PlannedFirst', 'pHet'), ('PlannedSecond', 'pFru'), ('PlannedThird', 'pyurn'), ('Flip', 23.513353868968)])
OrderedDict([('planneditems', '4'), ('plannedItemspaid', 'pRutr'), ('PlannedFirst', 'pHet'), ('PlannedSecond', 'pFru'), ('PlannedThird', 'pyurn'), ('Flip', 113.513353868968)])
OrderedDict([('planneditems', '5'), ('plannedItemspaid', 'pRutr'), ('PlannedFirst', 'pHet'), ('PlannedSecond', 'pFru'), ('PlannedThird', 'pyurn'), ('Flip', 133.513353868968)])
OrderedDict([('planneditems', '6'), ('plannedItemspaid', 'pRutr'), ('PlannedFirst', 'pHet'), ('PlannedSecond', 'pFru'), ('PlannedThird', 'pyurn'), ('Flip', 213.513353868968)])

我想从第二个列表中取出每个 Flip 值,然后用第一个列表的所有 Flip 值减去该值,然后将相应的键值对插入到第一个列表中,其中值之间的差异较小,如下所示,这是为了保持第一个列表的顺序列出值(因为它们已经排序)

脚步:

Take first flip value of second list : 23.513353868968
Subtract this with all the flip values of first list
23.513353868968 - 223.513353868968 = -200 (ignore the sign)
23.513353868968 - 243.513353868968 = 220
23.513353868968 - 263.513353868968 = 240 
23.513353868968 - 323.513353868968 = 300
23.513353868968 - 333.513353868968 = 313
23.513353868968 - 343.513353868968 = 320
23.513353868968 - 13.513353868968 = 10
23.513353868968 - 123.513353868968 = 100
23.513353868968 - 162.513353868968 = 139
23.513353868968 - 213.513353868968 = 190

在上面的结果中,第一个列表的翻转值 13.513353868968 的差异较小,所以我需要从第二个列表中选择翻转值 23.513353868968 的键值对,即

OrderedDict([('planneditems', '1'), ('plannedItemspaid', 'pRutr'), ('PlannedFirst', 'pHet'), ('PlannedSecond', 'pFru'), ('PlannedThird', 'pyurn'), ('Flip', 23.513353868968)])

并将其放在第一个较小的差异和第二个较小的差异之间,即它必须放在第一个列表中的第 8 行旁边

像这样我想从第二个列表中获取所有值并重复同样的事情,最后根据自定义排序插入第二个列表,它们也应该在自己内部排序

新列表预期的打印输出:

    OrderedDict([('Items', '1'), ('Itemspaid', 'Rutr'), ('First', 'Het'), ('Second', 'Fru'), ('Third', 'yurn'), ('Flip', 223.513353868968)])
    OrderedDict([('Items', '2'), ('Itemspaid', 'Rutr'), ('First', 'Het'), ('Second', 'Fru'), ('Third', 'yurn'), ('Flip', 243.513353868968)])
    OrderedDict([('Items', '3'), ('Itemspaid', 'Rutr'), ('First', 'Het'), ('Second', 'Fru'), ('Third', 'yurn'), ('Flip', 263.513353868968)])
    OrderedDict([('Items', '4'), ('Itemspaid', 'Rutr'), ('First', 'Het'), ('Second', 'Fru'), ('Third', 'yurn'), ('Flip', 323.513353868968)])
    OrderedDict([('Items', '5'), ('Itemspaid', 'Rutr'), ('First', 'Het'), ('Second', 'Fru'), ('Third', 'yurn'), ('Flip', 333.513353868968)])
    OrderedDict([('Items', '6'), ('Itemspaid', 'Rutr'), ('First', 'Het'), ('Second', 'Fru'), ('Third', 'yurn'), ('Flip', 343.513353868968)])
    OrderedDict([('Items', '7'), ('Itemspaid', 'Rutr'), ('First', 'Het'), ('Second', 'Fru'), ('Third', 'yurn'), ('Flip', 353.513353868968)])
    OrderedDict([('Items', '8'), ('Itemspaid', 'Rutr'), ('First', 'Het'), ('Second', 'Fru'), ('Third', 'yurn'), ('Flip', 13.513353868968)])
    OrderedDict([('planneditems', '1'), ('plannedItemspaid', 'pRutr'), ('PlannedFirst', 'pHet'), ('PlannedSecond', 'pFru'), ('PlannedThird', 'pyurn'), ('Flip', 23.513353868968)])
    OrderedDict([('planneditems', '4'), ('plannedItemspaid', 'pRutr'), ('PlannedFirst', 'pHet'), ('PlannedSecond', 'pFru'), ('PlannedThird', 'pyurn'), ('Flip', 113.513353868968)])
    OrderedDict([('Items', '9'), ('Itemspaid', 'Rutr'), ('First', 'Het'), ('Second', 'Fru'), ('Third', 'yurn'), ('Flip', 123.513353868968)])
    OrderedDict([('Items', '10'), ('Itemspaid', 'Rutr'), ('First', 'Het'), ('Second', 'Fru'), ('Third', 'yurn'), ('Flip', 162.513353868968)])
    OrderedDict([('Items', '11'), ('Itemspaid', 'Rutr'), ('First', 'Het'), ('Second', 'Fru'), ('Third', 'yurn'), ('Flip', 213.513353868968)])
    OrderedDict([('planneditems', '6'), ('plannedItemspaid', 'pRutr'), ('PlannedFirst', 'pHet'), ('PlannedSecond', 'pFru'), ('PlannedThird', 'pyurn'), ('Flip', 213.513353868968)])

我尝试了下面的代码,我无法按预期工作,它打印出最后一个条目,任何帮助将不胜感激。

for G in List2:
    diffs = []
    indexvalue=List2.index(G)
    for i in range(1, len(List1)):
        d1 = (G['Flip'] - List1[i - 1]['Flip'])
        d2 = (G['Flip'] - List1[i]['Flip'])
        t = (d1 + d2, i)
        diffs.append(t)
        j = min(diffs)[1]
new_xs=List1[0:j] + [List2[indexvalue]]+ List1[j:]
print(new_xs)

标签: python

解决方案


insertions = []
for G in List2:
    diffs = []
    indexvalue=List2.index(G)
    for i in range(1, len(List1)):
        d1 = abs(G['Flip'] - List1[i - 1]['Flip'])
        d2 = abs(G['Flip'] - List1[i]['Flip'])
        t = (d1 + d2, i)
        diffs.append(t)
    j = min(diffs)[1]
    insertions.append((j, indexvalue))
insertions.sort()
new_xs = []
last_j = 0
for j, indexvalue in insertions:
    new_xs += List1[last_j:j]
    new_xs.append(List2[indexvalue])
    last_j = j
new_xs += List1[last_j:]
print(new_xs)

输出与您的预期输出不匹配,但我确定您的预期装备不正确,无论如何(例如缺少计划的第 5 项)。


推荐阅读