Умножение списка строк в Python - PullRequest
1 голос
/ 29 мая 2019

Вопрос для начинающих: если у меня есть 2 списка, содержащие только строки, как мне объединить их в третий список, содержащий все элементы + каждый элемент одного списка + каждый элемент в другом списке?Я думал о циклах, но нет ли более простого способа сделать это?Пример:

listone = ['cat', 'dog' ]
listtwo = ['bin', 'sun'] 

resulting list = ['cat', 'dog', 'bin', 'sun', 'catbin', 'catsun', 'dogbin', 'dogsun', 'catbinsun', 'catsunbin', 'catcat', 'catdog', 'dogbin', 'dogcat']

РЕДАКТИРОВАТЬ: Спасибо всем за ответы, но я не объяснил, что я хочу сделать достаточно хорошо.Число строк в каждом списке должно быть неопределенным, и каждое слово должно быть объединено с каждым другим словом, но не только в форме «x + y».Я хочу также связать это с другими словами.Как и у = х + у + г

Ответы [ 6 ]

2 голосов
/ 29 мая 2019

Это должно сделать работу

In [29]: import itertools
In [30]: listone = ['cat', 'dog' ]
    ...: listtwo = ['bin', 'sun']

In [31]: output = listone + listtwo + [ "".join(items)  for items in list(itertools.product(listone, listtwo))]

In [32]: output
Out[32]: ['cat', 'dog', 'bin', 'sun', 'catbin', 'catsun', 'dogbin', 'dogsun']

Вы также можете сделать это без itertools

In [33]: output = listone + listtwo + [ item_one+item_two for item_one in listone for item_two in listtwo]

In [34]: output
Out[34]: ['cat', 'dog', 'bin', 'sun', 'catbin', 'catsun', 'dogbin', 'dogsun']
2 голосов
/ 29 мая 2019

Вы можете использовать декартово произведение и присоединиться. Попробуйте это:

import itertools
listone = ['cat', 'dog' ]
listtwo = ['bin', 'sun'] 
listone + listtwo + list(''.join(e) for e in itertools.product(listone, listtwo))

Результат:

['cat', 'dog', 'bin', 'sun', 'catbin', 'catsun', 'dogbin', 'dogsun']
0 голосов
/ 30 мая 2019

Если вы ищете только комбинации (то есть x + y, x + y + z, но не y + x или z + y + x), вы можете использовать функции combinations из itertools для формирования набора мощности:

from itertools import combinations

words  = listone+listtwo
result = ["".join(c) for r in range(1,len(words)+1) for c in combinations(words, r)]

print(result)

# ['cat', 'dog', 'bin', 'sun', 'catdog', 'catbin', 'catsun', 'dogbin',
#  'dogsun', 'binsun', 'catdogbin', 'catdogsun', 'catbinsun', 'dogbinsun',
#  'catdogbinsun']

примечание: наборы мощности комбинаций растут экспоненциально с увеличением количества исходных элементов: 2 ^ n - 1

Если вы хотите получить перестановки вместо, заменитеcombinations на permutations от itertools. (это даст на порядок больше элементов, чем комбинаций)

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

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

listone = ['cat', 'dog' ]
listtwo = ['bin', 'sun'] 
result_list = listone + listtwo + [x + y for x in listone for y in listtwo]
0 голосов
/ 29 мая 2019

Или, если вы хотите сделать это вручную, я бы сделал это так:

l = ["a","b"]
l2 = ["c","d"]
l3 = l + l2
print(l3)
for x, y in zip(l,l2):
    l3.append(x+y)
print(l3)

Не знаю, оптимально ли это.

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

Не импортируя itertools, вы также можете использовать конкатенацию строк при доступе к элементам listone и listtwo, например:

result = listone + listtwo + [listone[0] + listtwo[0], listone[0] + listtwo[1], listone[1] + listtwo[0], listone[1] + listtwo[1]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...