Python 用另一个列表的元素替换列表的元素
假设我们有以下列表:Python 用另一个列表的元素替换列表的元素,python,list,Python,List,假设我们有以下列表: t0=[('soybean','apple','banana', 'vegetable_oil'), ('soybean','bay','milk', 'smoke','orange'), ('cream','gelatin', 'watermelon')] t1=[('soybean', 'vegetable_oil'), ('bay', 'smoke'), ('gelatin', 'watermelon')] t2=['soybean:vegetable_oil', '
t0=[('soybean','apple','banana', 'vegetable_oil'), ('soybean','bay','milk', 'smoke','orange'), ('cream','gelatin', 'watermelon')]
t1=[('soybean', 'vegetable_oil'), ('bay', 'smoke'), ('gelatin', 'watermelon')]
t2=['soybean:vegetable_oil', 'bay:smoke', 'gelatin:watermelon']
对于t1
中的每个元素,我想通过t0
将字符串替换为t2
中的字符串,以便得到:
[[('apple','banana', 'soybean:vegetable_oil'), ('soybean','bay','milk', 'smoke','orange'), ('cream','gelatin', 'watermelon')],
[('soybean','apple','banana', 'vegetable_oil'), ('soybean','bay:smoke','milk','orange'), ('cream','gelatin', 'watermelon')],
[('soybean','apple','banana', 'vegetable_oil'), ('soybean','bay','milk', 'smoke','orange'), ('cream','gelatin:watermelone')]]
Mathematica有一个函数可以执行这样的操作,名为OrderlessPatternSequence
,我想知道如何在Python中实现这一点
更新:一个更简单的例子:
假设:
l0=[('a','b','c'),('d','e','f','g'),('b','d')]
我们也有
l1=[('a','c'),('e','g')]
及
l0
有两个元素,我想检查每个元素,如果('a','c')
或('e','g')
来自l1
的元素一起出现,我会在每次迭代中将它们替换为'a:c'
和'e:g'
。因此,我必须对l0进行两次检查,一次检查我是否有('a','c')
,一次检查我是否有('e','g')
因此,输出将是
[[('a:c','b'),('d','e','f','g'),('b','d')],
[('a','b','c'),('d','e:g','f'),('b','d')]]
我认为在python中没有内置的实现方法。也就是说,这里有一些代码可以满足您的需要:
# assume that t1 and t2 are the same length
for i in range(len(t0)):
for e1, e2 in zip(t1, t2):
set0 = set(t0[i]) # make sets out of t0 and t1 elements
set1 = set(e1)
diff = set0 - set1 # remove elements from t0 that were in t1
if len(diff) == len(set0) - len(set1): # check if any elements were removed
t0[i] = tuple(diff) + (e2,) # replace element from t0 with the diff plus the replacement
这是一个嵌套循环-对于t0
的每个元素,检查t1
的每个元素。在每次迭代中,首先对这些元素进行设置(set0
和set1
),然后从集合set0
中减去集合set1
。这为我们提供了set0
中的元素,但不在set1
中
接下来,我们检查设置差异前后set0
的大小差异是否与set1
中的元素数量完全相同-这意味着我们已经从set0
中找到并删除了set1
中的所有元素。如果是这种情况,那么我们用我们从中创建的集合替换t0[i]
(减去我们移除的元素),再加上我们应该替换的t2
中的元素
我可能误解了您在这里的目标-如果您只是想用相同的索引比较所有内容,您可以去掉嵌套循环,但我假设您想检查t0
的每个元素上的每个可能替换
t0=[('soybean','apple','banana', 'vegetable_oil'), ('soybean','bay','milk', 'smoke','orange'), ('cream','gelatin', 'watermelon')]
t1=[('soybean', 'vegetable_oil'), ('bay', 'smoke'), ('gelatin', 'watermelon')]
t2=['soybean:vegetable_oil', 'bay:smoke', 'gelatin:watermelon']
result = []
for v1, v2 in zip(t1, t2):
out = []
for i in t0:
common = set(v1).intersection(i)
if set(v1) == common:
out.append(tuple(list(set(i) - common) + [v2]))
else:
out.append(tuple(i))
result.append(out)
from pprint import pprint
pprint(result, width=200)
印刷品:
[[('apple', 'banana', 'soybean:vegetable_oil'), ('soybean', 'bay', 'milk', 'smoke', 'orange'), ('cream', 'gelatin', 'watermelon')],
[('soybean', 'apple', 'banana', 'vegetable_oil'), ('soybean', 'milk', 'orange', 'bay:smoke'), ('cream', 'gelatin', 'watermelon')],
[('soybean', 'apple', 'banana', 'vegetable_oil'), ('soybean', 'bay', 'milk', 'smoke', 'orange'), ('cream', 'gelatin:watermelon')]]
显示我在Mathematica中提到的函数代码,我在那里作为Table[t0/.{OrderlessPatternSequence[t1[[I,1]],t1[[I,2]],p_uuu]}:>{t2[[I]],p},{I,Length[t2]}代码>您应该在问题和代码中添加特定的标记。在这种情况下,提到Mathematica可能没有帮助-因为它是一个不同的软件,我试图在Python上实现这一点,因此我添加了标记Python和列表。你建议更好的标签吗?Hello@William,你能更详细地解释一下算法需要做什么吗?我不清楚“对于t1中的每个元素,我想通过t0并用t2中的字符串替换字符串”是什么意思,仅仅通过查看输入/输出很难推断。是的,这确实是针对t0
中每个元素的每个可能替换,我正在试着运行您的代码,我得到[(‘苹果’、‘香蕉’、‘大豆:植物油’、(‘橘子’、‘牛奶’、‘大豆’、‘贝:烟’、(‘奶油’、‘明胶:西瓜’)))]
但如果你看看我每一双的产量,我会更换一双。。。
[[('apple', 'banana', 'soybean:vegetable_oil'), ('soybean', 'bay', 'milk', 'smoke', 'orange'), ('cream', 'gelatin', 'watermelon')],
[('soybean', 'apple', 'banana', 'vegetable_oil'), ('soybean', 'milk', 'orange', 'bay:smoke'), ('cream', 'gelatin', 'watermelon')],
[('soybean', 'apple', 'banana', 'vegetable_oil'), ('soybean', 'bay', 'milk', 'smoke', 'orange'), ('cream', 'gelatin:watermelon')]]