Как мне упростить это решение? - PullRequest
0 голосов
/ 03 октября 2019

Функция «соединения» получает вложенный список «список слов». Этот список содержит несколько подсписков, каждый из которых представляет собой список слов, например: [["Tom", "Laurel", "Merkel"], ["Jerry","Hardy", "Macron"]]

Все подсписки содержат одинаковое количество слов. Функция должна возвращать список строк, где каждый элемент в позиции является соединением «и» всех элементов в одной позиции во всех подсписках.

Например: conjunctions([["Tom", "Laurel", "Merkel"],["Jerry","Hardy", "Macron"]]

должен вернуть

['Tom and Jerry', 'Laurel and Hardy', 'Merkel and Macron']

и

conjunctions([["one", "apples"],["two","oranges"],["three","bananas"]]

должен возвращать

['one and two and three', 'apples and oranges and bananas']

Для этого упражнения мне пришлось добавить различные сочетания слов. Есть ли какой-нибудь более простой / понятный способ сделать это, вам разрешается использовать только списки.

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

'' '

def союзы (список слов):

list1 = []
list2 = []
list3 = []

answer = []

if len(word_list) == 3:
    for i in word_list:
        #print(i[0])
        list1.append((i[0]))
        list2.append((i[1]))
    answer.append(list1[0] + " and " + list1[1] + " and " + list1[2])
    answer.append(list2[0] + " and " + list2[1] + " and " + list2[2])

elif len(word_list) ==2: 
    for i in word_list:
        #print(i[2])
        list1.append((i[0]))
        list2.append((i[1]))
        list3.append((i[2]))
    answer.append(list1[0] + " and " + list1[1])
    answer.append(list2[0] + " and " + list2[1])
    answer.append(list3[0] + " and " + list3[1])

return answer      

' ''

Ввод:

conjunctions([["one", "apples"],["two","oranges"],["three","bananas"]])

conjunctions([["Tom", "Laurel", "Merkel"], ["Jerry","Hardy", "Macron"]])

Выход:

['one and two and three', 'apples and oranges and bananas']

['Tom and Jerry', 'Laurel and Hardy', 'Merkel and Macron']

Ответы [ 4 ]

4 голосов
/ 03 октября 2019

Вы можете использовать str.join и zip :

def conjunctions(lst):
    return list(' and '.join(words) for words in zip(*lst))

print(conjunctions([["Tom", "Laurel", "Merkel"],["Jerry","Hardy", "Macron"]]))
print(conjunctions([["one", "apples"],["two","oranges"],["three","bananas"]]))

Выход

['Tom and Jerry', 'Laurel and Hardy', 'Merkel and Macron']
['one and two and three', 'apples and oranges and bananas']
1 голос
/ 03 октября 2019

Вы можете сделать что-то вроде этого:

twoDArray = [["one", "apples"],["two","oranges"], ["three","bananas"]]

answer = [0] * len(twoDArray[0])

for i, array in enumerate(twoDArray):
  for j, value in enumerate(array):
    if (answer[j] == 0):
      answer[j] = value
    else:
      answer[j] = answer[j] + " and " + value

print(answer)

Попробуйте это https://repl.it/repls/RightJointOutliers

Мы можем инициализировать пустой массив answer до длины первого массива в twoDArray.

answer = [0] * len(twoDArray[0])

Теперь мы перебираем twoDArray и значения в каждом массиве в array.

for i, array in enumerate(twoDArray):
  for j, value in enumerate(array):

Мы используем j индекс внутреннего для цикла дляопределить, какой индекс в нашем массиве answer мы устанавливаем.

Если значение индекса j еще не установлено, мы хотим установить его value. В противном случае мы добавим к value, который существует в индексе.

    if (answer[j] == 0):
      answer[j] = value
    else:
      answer[j] = answer[j] + " and " + value
0 голосов
/ 03 октября 2019

Вы можете сделать это в четыре строки (и, вероятно, меньше):

lst1 = [["Tom", "Laurel", "Merkel"],["Jerry","Hardy", "Macron"]]
lst2 = [["one", "apples"],["two","oranges"],["three","bananas"]]
def conjunctions(lst):
    final_list = []
    for idx,name in enumerate(lst[0]):
        final_list.append(' and '.join([i[idx] for i in lst]))
    return final_list

Вывод conjunctions(lst1):

['Tom and Jerry', 'Laurel and Hardy', 'Merkel and Macron']
0 голосов
/ 03 октября 2019
conjunctions = lambda L: list(map(lambda *names: ' and '.join(names), *L))
print(conjunctions([["one", "apples"],["two","oranges"],["three","bananas"]]))

Выходы

['one and two and three', 'apples and oranges and bananas']
...