Как получить комбинацию значений из нескольких списков элементов разной длины в Python 3.x? - PullRequest
0 голосов
/ 07 августа 2020

Ниже приведены списки, которые у меня есть -

hosts = ['a', 'b', 'c', 'd']
ips = ["10.0.0.0", "10.0.0.1", "10.0.0.2"]
paths = [["abc", "xyz"], "def", "klm"]
names = ["test1", "test2", "test1"]

Required output ->

[('a', '10.0.0.0', "abc", "test1"), ('a', '10.0.0.0', "xyz", "test1"), ('a', '10.0.0.1', "def", "test2"),  ('a', '10.0.0.2', "klm", "test1")] and so on for b, c and d values in hosts.

Примечание. Ips и имена - это обычные списки одинаковой длины. Пути могут быть вложенным списком, но общая длина будет такой же, как IP-адреса и имена. Однако длина IP-адресов, путей и имен не обязательно должна совпадать с хостами (это не вложенный список).

Может ли кто-нибудь предложить мне идею для этого, кроме избыточного написания циклов for, а также Zip не t работают из-за разной длины списков. Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 07 августа 2020

Не уверен в прямом пути. Использование циклов:

hosts = ['a', 'b', 'c', 'd']
ips = ["10.0.0.0", "10.0.0.1", "10.0.0.2"]
paths = [["abc", "xyz"], "def", "klm"]
names = ["test1", "test2", "test1"]

final_list = []
for elem in hosts:
  for i in range(len(ips)):
    if isinstance(paths[i], list):
      for j in range(len(paths[i])):
        final_list.append((elem, ips[i], paths[i][j], names[i]))
    elif isinstance(paths[i], str):
      final_list.append((elem, ips[i], paths[i], names[i]))

print(final_list)
0 голосов
/ 07 августа 2020

Вы можете использовать рекурсию с генератором:

def combos(d, c = []):
  if not d:
     yield tuple(c)
  else:
     for i in [j for k in d[0] for j in (k if isinstance(k, list) else [k])]:
        yield from combos(d[1:], c+[i])
        

hosts = ['a', 'b', 'c', 'd']
ips = ["10.0.0.0", "10.0.0.1", "10.0.0.2"]
paths = [["abc", "xyz"], "def", "klm"]
names = ["test1", "test2", "test1"]
print(list(combos([hosts, ips, paths, names])))

Вывод:

[('a', '10.0.0.0', 'abc', 'test1'), ('a', '10.0.0.0', 'abc', 'test2'), ('a', '10.0.0.0', 'abc', 'test1'), ('a', '10.0.0.0', 'xyz', 'test1'), ('a', '10.0.0.0', 'xyz', 'test2'), ('a', '10.0.0.0', 'xyz', 'test1'), ('a', '10.0.0.0', 'def', 'test1'), ('a', '10.0.0.0', 'def', 'test2'), ('a', '10.0.0.0', 'def', 'test1'), ('a', '10.0.0.0', 'klm', 'test1'), ('a', '10.0.0.0', 'klm', 'test2'), ('a', '10.0.0.0', 'klm', 'test1'), ('a', '10.0.0.1', 'abc', 'test1'), ('a', '10.0.0.1', 'abc', 'test2'), ('a', '10.0.0.1', 'abc', 'test1'), ('a', '10.0.0.1', 'xyz', 'test1'), ('a', '10.0.0.1', 'xyz', 'test2'), ('a', '10.0.0.1', 'xyz', 'test1'), ('a', '10.0.0.1', 'def', 'test1'), ('a', '10.0.0.1', 'def', 'test2'), ('a', '10.0.0.1', 'def', 'test1'), ('a', '10.0.0.1', 'klm', 'test1'), ('a', '10.0.0.1', 'klm', 'test2'), ('a', '10.0.0.1', 'klm', 'test1'), ('a', '10.0.0.2', 'abc', 'test1'), ('a', '10.0.0.2', 'abc', 'test2'), ('a', '10.0.0.2', 'abc', 'test1'), ('a', '10.0.0.2', 'xyz', 'test1'), ('a', '10.0.0.2', 'xyz', 'test2'), ('a', '10.0.0.2', 'xyz', 'test1'), ('a', '10.0.0.2', 'def', 'test1'), ('a', '10.0.0.2', 'def', 'test2'), ('a', '10.0.0.2', 'def', 'test1'), ('a', '10.0.0.2', 'klm', 'test1'), ('a', '10.0.0.2', 'klm', 'test2'), ('a', '10.0.0.2', 'klm', 'test1'), ('b', '10.0.0.0', 'abc', 'test1'), ('b', '10.0.0.0', 'abc', 'test2'), ('b', '10.0.0.0', 'abc', 'test1'), ('b', '10.0.0.0', 'xyz', 'test1'), ('b', '10.0.0.0', 'xyz', 'test2'), ('b', '10.0.0.0', 'xyz', 'test1'), ('b', '10.0.0.0', 'def', 'test1'), ('b', '10.0.0.0', 'def', 'test2'), ('b', '10.0.0.0', 'def', 'test1'), ('b', '10.0.0.0', 'klm', 'test1'), ('b', '10.0.0.0', 'klm', 'test2'), ('b', '10.0.0.0', 'klm', 'test1'), ('b', '10.0.0.1', 'abc', 'test1'), ('b', '10.0.0.1', 'abc', 'test2'), ('b', '10.0.0.1', 'abc', 'test1'), ('b', '10.0.0.1', 'xyz', 'test1'), ('b', '10.0.0.1', 'xyz', 'test2'), ('b', '10.0.0.1', 'xyz', 'test1'), ('b', '10.0.0.1', 'def', 'test1'), ('b', '10.0.0.1', 'def', 'test2'), ('b', '10.0.0.1', 'def', 'test1'), ('b', '10.0.0.1', 'klm', 'test1'), ('b', '10.0.0.1', 'klm', 'test2'), ('b', '10.0.0.1', 'klm', 'test1'), ('b', '10.0.0.2', 'abc', 'test1'), ('b', '10.0.0.2', 'abc', 'test2'), ('b', '10.0.0.2', 'abc', 'test1'), ('b', '10.0.0.2', 'xyz', 'test1'), ('b', '10.0.0.2', 'xyz', 'test2'), ('b', '10.0.0.2', 'xyz', 'test1'), ('b', '10.0.0.2', 'def', 'test1'), ('b', '10.0.0.2', 'def', 'test2'), ('b', '10.0.0.2', 'def', 'test1'), ('b', '10.0.0.2', 'klm', 'test1'), ('b', '10.0.0.2', 'klm', 'test2'), ('b', '10.0.0.2', 'klm', 'test1'), ('c', '10.0.0.0', 'abc', 'test1'), ('c', '10.0.0.0', 'abc', 'test2'), ('c', '10.0.0.0', 'abc', 'test1'), ('c', '10.0.0.0', 'xyz', 'test1'), ('c', '10.0.0.0', 'xyz', 'test2'), ('c', '10.0.0.0', 'xyz', 'test1'), ('c', '10.0.0.0', 'def', 'test1'), ('c', '10.0.0.0', 'def', 'test2'), ('c', '10.0.0.0', 'def', 'test1'), ('c', '10.0.0.0', 'klm', 'test1'), ('c', '10.0.0.0', 'klm', 'test2'), ('c', '10.0.0.0', 'klm', 'test1'), ('c', '10.0.0.1', 'abc', 'test1'), ('c', '10.0.0.1', 'abc', 'test2'), ('c', '10.0.0.1', 'abc', 'test1'), ('c', '10.0.0.1', 'xyz', 'test1'), ('c', '10.0.0.1', 'xyz', 'test2'), ('c', '10.0.0.1', 'xyz', 'test1'), ('c', '10.0.0.1', 'def', 'test1'), ('c', '10.0.0.1', 'def', 'test2'), ('c', '10.0.0.1', 'def', 'test1'), ('c', '10.0.0.1', 'klm', 'test1'), ('c', '10.0.0.1', 'klm', 'test2'), ('c', '10.0.0.1', 'klm', 'test1'), ('c', '10.0.0.2', 'abc', 'test1'), ('c', '10.0.0.2', 'abc', 'test2'), ('c', '10.0.0.2', 'abc', 'test1'), ('c', '10.0.0.2', 'xyz', 'test1'), ('c', '10.0.0.2', 'xyz', 'test2'), ('c', '10.0.0.2', 'xyz', 'test1'), ('c', '10.0.0.2', 'def', 'test1'), ('c', '10.0.0.2', 'def', 'test2'), ('c', '10.0.0.2', 'def', 'test1'), ('c', '10.0.0.2', 'klm', 'test1'), ('c', '10.0.0.2', 'klm', 'test2'), ('c', '10.0.0.2', 'klm', 'test1'), ('d', '10.0.0.0', 'abc', 'test1'), ('d', '10.0.0.0', 'abc', 'test2'), ('d', '10.0.0.0', 'abc', 'test1'), ('d', '10.0.0.0', 'xyz', 'test1'), ('d', '10.0.0.0', 'xyz', 'test2'), ('d', '10.0.0.0', 'xyz', 'test1'), ('d', '10.0.0.0', 'def', 'test1'), ('d', '10.0.0.0', 'def', 'test2'), ('d', '10.0.0.0', 'def', 'test1'), ('d', '10.0.0.0', 'klm', 'test1'), ('d', '10.0.0.0', 'klm', 'test2'), ('d', '10.0.0.0', 'klm', 'test1'), ('d', '10.0.0.1', 'abc', 'test1'), ('d', '10.0.0.1', 'abc', 'test2'), ('d', '10.0.0.1', 'abc', 'test1'), ('d', '10.0.0.1', 'xyz', 'test1'), ('d', '10.0.0.1', 'xyz', 'test2'), ('d', '10.0.0.1', 'xyz', 'test1'), ('d', '10.0.0.1', 'def', 'test1'), ('d', '10.0.0.1', 'def', 'test2'), ('d', '10.0.0.1', 'def', 'test1'), ('d', '10.0.0.1', 'klm', 'test1'), ('d', '10.0.0.1', 'klm', 'test2'), ('d', '10.0.0.1', 'klm', 'test1'), ('d', '10.0.0.2', 'abc', 'test1'), ('d', '10.0.0.2', 'abc', 'test2'), ('d', '10.0.0.2', 'abc', 'test1'), ('d', '10.0.0.2', 'xyz', 'test1'), ('d', '10.0.0.2', 'xyz', 'test2'), ('d', '10.0.0.2', 'xyz', 'test1'), ('d', '10.0.0.2', 'def', 'test1'), ('d', '10.0.0.2', 'def', 'test2'), ('d', '10.0.0.2', 'def', 'test1'), ('d', '10.0.0.2', 'klm', 'test1'), ('d', '10.0.0.2', 'klm', 'test2'), ('d', '10.0.0.2', 'klm', 'test1')]
0 голосов
/ 07 августа 2020

Вы это ищете?

from itertools import product

def flatten(ips, paths, names):
    result = []
    for i, p, n in zip(ips, paths, names):
        if isinstance(p, list):
            result.extend(product([i], p, [n]))
        else:
            result.append((i, p, n))
    return result


all_outputs = []
for entry in product(hosts, flatten(ips, paths, names)):
    output = [entry[0]]
    output.extend(*entry[1:])
    all_outputs.append(output)

Вывод

[['a', '10.0.0.0', 'abc', 'test1'],
 ['a', '10.0.0.0', 'xyz', 'test1'],
 ['a', '10.0.0.1', 'def', 'test2'],
 ['a', '10.0.0.2', 'klm', 'test1'],
 ['b', '10.0.0.0', 'abc', 'test1'],
 ['b', '10.0.0.0', 'xyz', 'test1'],
 ['b', '10.0.0.1', 'def', 'test2'],
 ['b', '10.0.0.2', 'klm', 'test1'],
 ['c', '10.0.0.0', 'abc', 'test1'],
 ['c', '10.0.0.0', 'xyz', 'test1'],
 ['c', '10.0.0.1', 'def', 'test2'],
 ['c', '10.0.0.2', 'klm', 'test1'],
 ['d', '10.0.0.0', 'abc', 'test1'],
 ['d', '10.0.0.0', 'xyz', 'test1'],
 ['d', '10.0.0.1', 'def', 'test2'],
 ['d', '10.0.0.2', 'klm', 'test1']]
...