用另一个列表的元素替换列表的元素

时间:2019-07-08 13:59:42

标签: 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', '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')

2 个答案:

答案 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的每个元素。在每次迭代中,首先从那些元素(set0set1)中生成集合,然后从集合set1中减去集合set0。这样就为我们提供了set0中的元素,但没有set1中的元素。

接下来,我们检查set0与设置差异前后的大小差异是否与set1中的元素数完全相同-这意味着我们已经找到并删除了<来自{{1}的set1中的em> all 元素。如果是这种情况,则将set0替换为由此生成的集合(减去我们删除的元素),再加上我们应替换的t0[i]中的元素。

我在这里可能会误解您的目标-如果您只想比较具有相同索引的所有内容,则可以摆脱嵌套循环,但是我假设您想检查{{1 }}。