полный список, если первый и последний элемент равен - PullRequest
0 голосов
/ 09 мая 2019

У меня проблема при попытке преобразовать список.

Исходный список выглядит так:

[['a','b','c',''],['c','e','f'],['c','g','h']]

Теперь я хочу сделать вывод следующим образом:

[['a','b','c','e','f'],['a','b','c','g','h']]

Когда пробел найден (''), объедините три списка в два списка.

Мне нужно написать функцию, чтобы сделать это для меня.

Вот что я попробовал:

for x in mylist:

    if x[len(x) - 1] == '':

        m = x[len(x) - 2]
        for y in mylist:
            if y[0] == m:
                combine(x, y)


def combine(x, y):
    for m in y:
        if not m in x:
            x.append(m)
    return(x)

но он работает не так, как я хочу.

Ответы [ 5 ]

1 голос
/ 09 мая 2019

попробуйте это:

mylist = [['a','b','c',''],['c','e','f'],['c','g','h']]


def combine(x, y):
    for m in y:
        if not m in x:
            x.append(m)
    return(x)

result = [] 

for x in mylist:

    if x[len(x) - 1] == '':

        m = x[len(x) - 2]
        for y in mylist:
            if y[0] == m:
                result.append(combine(x[0:len(x)-2], y))

print(result)

ваша проблема была с

combine(x[0:len(x)-2], y)

вывод:

[['a', 'b', 'c', 'e', 'f'], ['a', 'b', 'c', 'g', 'h']]
0 голосов
/ 09 мая 2019

попробуйте мое решение, хотя оно изменит порядок списка, но это довольно простой код

lst = [['a', 'b', 'c', ''], ['c', 'e', 'f'], ['c', 'g', 'h']]
lst[0].pop(-1)
print([list(set(lst[0]+lst[1])), list(set(lst[0]+lst[2]))])
0 голосов
/ 09 мая 2019

Я сделал это со стандартной библиотекой только с комментариями. Пожалуйста, отошлите это.

mylist = [['a','b','c',''],['c','e','f'],['c','g','h']]

# I can't make sure whether the xlist's item is just one or not.
# So, I made it to find all
# And, you can see how to get the last value of a list as [-1]
xlist = [x for x in mylist if x[-1] == '']
ylist = [x for x in mylist if x[-1] != '']

result = []
# combine matrix of x x y
for x in xlist:
    for y in ylist:
        c = x + y # merge
        c = [i for i in c if i] # drop ''
        c = list(set(c)) # drop duplicates
        c.sort() # sort
        result.append(c)  # add to result

print (result)

Результат

[['a', 'b', 'c', 'e', 'f'], ['a', 'b', 'c', 'g', 'h']]
0 голосов
/ 09 мая 2019

То есть вы хотите объединить 2 списка? Если это так, вы можете использовать один из 2 способов:

Либо используйте оператор +, либо используйте extend() метод.

И затем вы помещаете это в функцию.

0 голосов
/ 09 мая 2019

Ваш код почти работает, за исключением того, что вы никогда ничего не делаете с результатом combine (распечатываете его или добавляете в какой-либо список результатов) и не удаляете элемент ''. Однако для более длинного списка это может быть немного медленным, поскольку оно имеет квадратичную сложность O (n²).

Вместо этого вы можете использовать словарь для сопоставления первых элементов с остальными элементами списков. Затем вы можете использовать цикл или списки, чтобы объединить списки с правильными суффиксами:

lst = [['a','b','c',''],['c','e','f'],['c','g','h']]

import collections
replacements = collections.defaultdict(list)
for first, *rest in lst:
    replacements[first].append(rest)

result = [l[:-2] + c for l in lst if l[-1] == "" for c in replacements[l[-2]]]
# [['a', 'b', 'c', 'e', 'f'], ['a', 'b', 'c', 'g', 'h']]

Если в списке может быть несколько заполнителей '', и если они могут появиться в середине списка, то все становится немного сложнее. Вы можете сделать это рекурсивной функцией. (Это можно сделать более эффективным, используя индекс вместо многократного разбиения списка.)

def replace(lst, last=None):
    if lst:
        first, *rest = lst
        if first == "":
            for repl in replacements[last]:
                yield from replace(repl + rest)
        else:
            for res in replace(rest, first):
                yield [first] + res
    else:
        yield []

for l in lst:
    for x in replace(l):
        print(x)

Выход для lst = [['a','b','c','','b',''],['c','b','','e','f'],['c','g','b',''],['b','x','y']]:

['a', 'b', 'c', 'b', 'x', 'y', 'e', 'f', 'b', 'x', 'y']
['a', 'b', 'c', 'g', 'b', 'x', 'y', 'b', 'x', 'y']
['c', 'b', 'x', 'y', 'e', 'f']
['c', 'g', 'b', 'x', 'y']
['b', 'x', 'y']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...