Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在寻找在python中将2个列表链接回一起的方法_Python_List - Fatal编程技术网

正在寻找在python中将2个列表链接回一起的方法

正在寻找在python中将2个列表链接回一起的方法,python,list,Python,List,我基本上有一个列表:列表[(名字1,分数1),(名字2,分数2)等等]。我使用另一个列表中的分数,根据算法将这些分数随机化,但之后我想将每个分数链接回每个名字。分数可以是一样的,但没关系。如果两个分数是同名的,那么哪个分数与哪个名字相关联并不重要,因为分数是相同的。请帮忙 输入: 列表1=[(0,a)、(100,b)、(200,c)、(300,d)] 列表2=[[200,0],[300100]] 预期产出: 清单3=[(200,c),(0,a)],[(300,d),(100,b)]] 如何从列表

我基本上有一个列表:列表[(名字1,分数1),(名字2,分数2)等等]。我使用另一个列表中的分数,根据算法将这些分数随机化,但之后我想将每个分数链接回每个名字。分数可以是一样的,但没关系。如果两个分数是同名的,那么哪个分数与哪个名字相关联并不重要,因为分数是相同的。请帮忙

输入: 列表1=[(0,a)、(100,b)、(200,c)、(300,d)] 列表2=[[200,0],[300100]]

预期产出: 清单3=[(200,c),(0,a)],[(300,d),(100,b)]]

如何从列表2和列表1中获取列表3

*list1=[(0,a)、(0,b)、(0,c)、(0,d)]也是一个有效的列表

那么,如果 清单3=[(0,a)、(0,b)],[(0,c)、(0,d)]或
list3=[(0,d),(0,b)],[(0,c),(0,a)]]*

您可以使用自定义键函数对列表1进行排序,尽管这可能非常慢:

def sort_by_order_in_other_list(其他_list)):
def_内部(tup):
返回其他\u列表索引(tup[0])
返回内部
列表3=已排序(列表1,键=按其他列表(列表2)中的顺序排序)
这可能是非常小的列表的最佳算法。对于较长的列表,我建议先做一遍,以使
list2
更易于参考:

dict2={i:i的值,枚举中的值(list2)}
list3=已排序(list1,key=lambda x:dict2[x[0]])

您的第一个列表看起来像一个查找表。我认为最快的转换方法是将列表1转换为dict,然后进行查找以将列表2转换为列表3:

dict1 = dict(list1)

list3 = [[(item, dict1[item]) for item in sublist] for sublist in list2]

# output: [[(200, 'c'), (0, 'a')], [(300, 'd'), (100, 'b')]]
Python dict有一个构造函数,它接受对的列表,就像您的
list1
一样。这将
list1
转换为快速查找表
dict1
。然后遍历子列表,然后遍历每个子列表中的项,然后执行该查找

我不记得Python dict构造函数的效率了,但它并不比
O(nlog(n))

每当你有一个对的列表时,有时就值得考虑一下是否可以更容易地将其用作dict。Python喜欢dict


编辑:请注意,dicts每个键只能存储一个值。虽然我最初认为这没问题,但后来澄清情况并非如此

下一个解决方案是将其转换为多重贴图,然后在运行时销毁它。多重映射类似于dict,但它存储了一个包含该键的所有值的列表——每个键不限于一个值。显然,因为我们不需要整个列表,所以每个实例只需要一个唯一的值,我们将从映射中删除列表中的最后一个值。代码看起来非常相似,但是构建multimap与构建dict看起来不同

我将在这里提供一个更完整的示例来演示

from collections import defaultdict

def impose_structure (list1, list2):
    # This multimap will be a map from the key to a list of all values of that key,
    # like {0: ['a', 'b', 'c', 'd']}
    multimap = defaultdict (list)

    for key, value in list1:
        multimap[key].append (value)

    # We'll do the same thing as before, but now we'll remove values from the end
    # so we don't have duplicates
    return [[(item, multimap[item].pop ()) for item in sublist] for sublist in list2]


if __name__ == '__main__':
    list1 = [(0, 'a'), (0, 'b'), (100, 'c'), (100, 'd')]
    list2 = [[100, 0], [0, 100]]

    print (impose_structure (list1, list2))

# outputs: [[(100, 'd'), (0, 'b')], [(0, 'a'), (100, 'c')]]

您的列表1的格式是字典可以接受的,您希望做的是用这些字典的索引对应项替换值。因此,最简单的方法是将列表1转换为实际的字典,并在列表理解中使用它来映射列表2的值:

list1 = [(0, "a"), (100, "b"), (200, "c"), (300, "d")]
list2 = [[200, 0], [300, 100]]

dict1 = dict(list1)    
list3 = [ [(i,dict1[i]) for i in r] for r in list2 ]

print(list3)
[[(200, 'c'), (0, 'a')], [(300, 'd'), (100, 'b')]]

请欢迎来到stackoverflow,如果你能添加一点代码来显示你的预期结果会是什么样子,那就太好了。另一个列表在哪里?你说的随机化是什么意思?我基本上有一个按顺序排列的30个名字和分数的列表。我把所有的分数都放在一个单独的列表中,然后随机化(这部分不重要),然后我需要将每个分数重新分配到它的原始名称。这是为了团队建设。你提供的不是一个最小的可复制的例子。嘿@Adam,我更新了问题本身。列表2按子列表排序(这些数字必须留在子列表中)。你有什么办法可以帮我解答这个新问题吗?在每个子列表中保留数字是很重要的。嘿,我试过你的方法,如果每件事都是唯一的,那就好了。我的意思是**list1=[(0,a)、(0,b)、(0,c)、(0,d)]**也是一个有效的列表。如果**list3=[(0,a),(0,b)],[(0,c),(0,d)],或者list3=[(0,d),(0,b)],[(0,c),(0,a)],则无所谓。不幸的是,您的代码随后会产生错误:(在您的代码中,它将给出列表3=[[(0,a),(0,a)],[(0,a),(0,a)]]是的,正如最后的免责声明中所说的!我误解了你的问题,所以也许你应该更新你的示例输入和输出,使其明确无误。是的,如果你有时间在第二天以某种方式创建代码,那将是惊人的,我对编码非常陌生,很抱歉提出了一个错误的书面问题。@VictorvandenDijk,我是updated给出了这个答案,我认为它应该符合你的标准。如果它解决了你的问题,接受这个答案会很有帮助。