如何简化此解决方案?

时间:2019-10-03 19:09:57

标签: python python-3.x list return list-comprehension

函数'conjunctions'消除了嵌套列表'word_list'。该列表包含多个子列表,每个子列表包含一个单词列表,例如: [["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连词(word_list):

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 个答案:

答案 0 :(得分:4)

您可以使用str.joinzip

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 :(得分:1)

您可以执行以下操作:

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)

尝试fractionComplete

我们可以将一个空的answer数组初始化为twoDArray中第一个数组的长度。

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

现在,我们遍历twoDArrayarray中每个数组中的值。

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

我们使用j内部for循环的索引来确定我们要设置的answer数组中的索引。

如果尚未设置索引j上的值,我们要设置其value。 否则,我们将附加到索引处存在的value

    if (answer[j] == 0):
      answer[j] = value
    else:
      answer[j] = answer[j] + " and " + value

答案 2 :(得分:0)

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']

答案 3 :(得分:0)

您可以四行(甚至更少)来完成它:

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']