假设我们有以下列表:
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')]
和
l2=['a:c','e:g']
l0
有两个元素,我要遍历每个元素,如果('a','c')
中的('e','g')
或l1
一起出现,我用{{1 }}和'a:c'
。因此,我必须经过'e:g'
两次,以检查是否在任何地方有l0
,并且一次要查看是否有('a','c')
因此输出为
('e','g')
答案 0 :(得分:1)
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')]]
答案 1 :(得分:0)
我认为在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
)中生成集合,然后从集合set1
中减去集合set0
。这样就为我们提供了set0
中的元素,但没有set1
中的元素。
接下来,我们检查set0
与设置差异前后的大小差异是否与set1
中的元素数完全相同-这意味着我们已经找到并删除了<来自{{1}的set1
中的em> all 元素。如果是这种情况,则将set0
替换为由此生成的集合(减去我们删除的元素),再加上我们应替换的t0[i]
中的元素。
我在这里可能会误解您的目标-如果您只想比较具有相同索引的所有内容,则可以摆脱嵌套循环,但是我假设您想检查{{1 }}。