Подстановка элементов списка с элементами другого списка - PullRequest
0 голосов
/ 08 июля 2019

Предположим, у нас есть следующие списки:

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 появятся в нем вместе, я заменю их на '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')]]

Ответы [ 2 ]

1 голос
/ 08 июля 2019
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')]]
0 голосов
/ 08 июля 2019

Я не думаю, что есть встроенный для этого в 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 - это означает, что мы нашли и удалили all элементов от set1 от set0. Если это так, то мы заменим t0[i] на набор, который мы из него сделали (за вычетом удаленных элементов), плюс элемент из t2, который мы должны заменить.

Возможно, я неправильно понимаю вашу цель - если вы просто хотите сравнить все с одним и тем же индексом, вы можете избавиться от вложенного цикла, но я предполагал, что вы хотите проверить каждую возможную замену для каждого элемента t0 ,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...