Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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 用另一个列表的元素替换列表的元素_Python_List - Fatal编程技术网

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')]]