这与这里的大多数排序问题略有不同,我还没有弄清楚如何让它发挥作用。我有3个列表,其中2个我需要匹配第3个列表的顺序。列表2中的整数对应于列表1中的相同索引字。如果第3列表中的项目不在其他两个中,则需要为其生成随机数。第三个列表也是一个元组,但它已经排序,因此不确定是否重要。如果列表中的单词是1和2但不是3,我们可以删除它们。
例如:
import random
List1 = ['test', 'list', '1']
list2 = [[1,2,3], [4,5,6], [1,3,5]
list3 = [('this', 1),('is',2),('a',3),('test',4),('list',5)]
我希望结果是什么
list1 = ['this', 'is', 'a' , 'test', 'list'] (just equal to first item in list 3)
list2 = [random((1,4),3), random((1,4),3), random((1,4),3), [1,2,3],[4,5,6]]
答案 0 :(得分:1)
通过zip
ping list1
和list2
的相应元素来创建字典。然后,您可以通过该字典中的get
元素创建最终列表,或者如果元素不存在则创建随机数列表。
>>> list1 = ['test', 'list', '1']
>>> list2 = [[1,2,3], [4,5,6], [1,3,5]]
>>> d = dict(zip(list1, list2))
>>> d
{'1': [1, 3, 5], 'list': [4, 5, 6], 'test': [1, 2, 3]}
>>> list4 = [x for x, y in list3]
>>> list5 = [d.get(x, [random.randint(1,4) for _ in range(3)]) for x in list4]
>>> list5
[[1, 2, 4], [3, 3, 1], [3, 3, 1], [1, 2, 3], [4, 5, 6]]
一些注意事项:
我将输出中的list1
和list2
重命名为list4
和list5
。
这里,相同的单词引用来自list2
的相同的数字列表实例,即如果您修改了一个,则修改所有这些实例。如果这不是您想要的,请在list(d.get(...))
的列表推导中使用list5
为每个元素创建新列表。
在默认情况下使用get
可能会有点浪费,因为它会创建所有这些列表并调用randint
,即使未使用默认值也是如此。相反,您可能希望使用三元组:[d[x] if x in d else [random list] for ...]
两种方式,如果同一个单词在list3
中出现两次但不在list1
中,则这两个单词会在{{1}中得到不同的随机数}};如果您想要相同单词的相同随机列表,请使用list5