Условное объединение списков - PullRequest
0 голосов
/ 25 декабря 2018

Я пытаюсь объединить два списка на основе следующих правил:

Первый элемент в списке list1 должен быть объединен с последним элементом в list2, второй элемент в list1 должен быть объединен свторой последний элемент в list2 и т. д.

Если элемент в list1 / list2 имеет значение None, то соответствующий элемент в другом списке должен оставаться таким же, как и в объединенном списке.

Я чувствую, что, возможно, мне придется использовать связанный список здесь, но я не уверен.Я пытаюсь найти решение, перебирая списки, но не могу понять логику здесь.

def merge_list(list1, list2):
    merged_data=""
    new_str=""
    #write your logic here
    for l1 in list1:
        for l2 in list2[::-1]:
            if l1 is None or l2 is None:
                pass
            else:
                new_str = l1+l2
                i=list2.index(l2)
                print(new_str)
            break
    #return resultant_data


list1=['A', 'app','a', 'd', 'ke', 'th', 'doc', 'awa']
list2=['y','tor','e','eps','ay',None,'le','n']
merged_data=merge_list(list1,list2)
print(merged_data)

Ожидаемый результат:

«Яблоко в день держит доктора подальше»

Ответы [ 7 ]

0 голосов
/ 25 декабря 2018

Короткий ответ без использования почтового индекса.

" ".join([list1[x]+[y if y is not None else '' for y in list2 ][::-1][x] for x in range(len(list1)-1)]
0 голосов
/ 02 июня 2019
list1=['A', 'app','a', 'd', 'ke', 'th', 'doc', 'awa']
list2=['y','tor','e','eps','ay',None,'le','n']
a=list2.remove(None)
list2.insert(5,"")
list3 = [ str(x[0]) + x[1]   for x in zip(list1, list2[::-1]) ]
print ' '.join(list3)

вывод:

Яблоко в день держит доктора подальше

0 голосов
/ 25 декабря 2018
def fetch_index(list2, item_index):
    x = list2[::-1]
    return x[item_index]

def merge_list(list1, list2):
    list_3 = []
    #write your logic here
    for l1 in list1:
        l2 = fetch_index(list2, list1.index(l1))
        if l1 is None and l2 is None:
            pass
        elif l1 is None:
            list_3.append(l2)
        elif l2 is None:
            list_3.append(l1)
        else:
            list_3.append(l1+l2)
    return(list_3)

list1=['A', 'app','a', 'd', 'ke', 'th', 'doc', 'awa']
list2=['y','tor','e','eps','ay',None,'le','n']
x = merge_list(list1,list2)
print ' '.join(i for i in x)

Более длинная версия, если вы не хотите использовать zip

0 голосов
/ 25 декабря 2018

Сначала используйте list comprehensions, чтобы объединить два списка, а затем преобразовать этот список в string.

" ".join(str(x) for x in [list1[i]+list2[len(list2)-1-i] if list2[len(list2)-1-i] != None else list1[i] for i in range(len(list1))])
    'An apple a day keeps the doctor away'
0 голосов
/ 25 декабря 2018

Убедитесь, что списки имеют одинаковую длину, тогда достаточно просто почтового индекса.Но замените значение None на '' (пустая строка)

["".join(row) for row in zip(list1, reversed(list2))]

=>

['An', 'apple', 'a', 'day', 'keeps', 'the', 'doctor', 'away']
0 голосов
/ 25 декабря 2018

Вы можете использовать zip, чтобы выполнить итерацию по двум спискам одновременно:

def merge_list(lst1,lst2):
    s = ''
    for x, y in zip(lst1, lst2[::-1]):
        if y and x:
            s += x + y
        elif x:
            s += x
        elif y:
            s += y
        s += ' '
    return s[:-1]

list1 = ['A', 'app','a', 'd', 'ke', 'th', 'doc', 'awa']
list2 = ['y','tor','e','eps','ay',None,'le','n']
merged_data = merge_list(list1,list2)

print(merged_data)
# An apple a day keeps the doctor away

Вы можете сократить это и использовать понимание списка, как показано ниже (но я бы предпочел другой, который более читабелен):

def merge_list(lst1,lst2):
    return ' '.join(x + y if x and y else x if x else y for x, y in zip(lst1, lst2[::-1]))
0 голосов
/ 25 декабря 2018

Предполагая, что оба списка имеют одинаковую длину

>>> list1=['A', 'app','a', 'd', 'ke', 'th', 'doc', 'awa']
>>> list2=['y','tor','e','eps','ay',None,'le','n']
>>> ' '.join([l1 + l2 if l1 and l2 else l1 if l1 and not l2 else l2 for l1, l2 in zip(list1, reversed(list2)) if l1 and l2])
'An apple a day keeps the doctor away'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...