Генерация выходного списка из трех списков строк на основе логики - PullRequest
0 голосов
/ 20 ноября 2019

У меня есть три условия: условие перехода, истинное условие и ложное условие.

  • Я хочу сохранить порядок входов.
  • Один список содержит переходы для каждого входа, другой список содержит истинные условия для каждого входа,и третий список содержит ложные условия для каждого входа.
  • Я хочу прокрутить элементы в t_list и вывести другие входные данные из p_list или n_list, но не вход, который находится в процессе перехода.
  • Если логика 'OR' Я хочу использовать n_list, иначе - если логика 'AND' Я хочу использовать p_list.
t_list = ['Input 1 transitions to true', 'Input 2 transitions to true', 'Input 3 transitions to true']
p_list = ['Input 1 is true', 'Input 2 is true', 'Input 3 is true']
n_list = ['Input 1 is false', 'Input 2 is false', 'Input 3 is false']

I 'Я определяю метод для генерации 4-го списка для моих условий вывода.

num_inputs = len(t_List)
logic = 'OR' #or 'AND' based on prior input

def combination_generator (t_List, p_List, n_List, logic, num_inputs):
    count = 0
    final_array = []
    temp_array = []  
    for item in t_List:
        temp_array.append(item)
    if logic == 'OR':
        for item in n_List:
            temp_array.append(item)
    elif logic == 'AND':
        for item in p_List:
            temp_array.append(item)

Мое первоначальное решение использовало itertools.combinations() следующим образом:

for x in itertools.combinations(temp_array, num_inputs):
    #file.write(f'{count} {x}\n')
    count+=1
    final_array.append(x)

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

Мне кажется, что есть лучшее решение, возможно, со списком.

final_list = [item for item in n_List if logic == 'OR']

Идеальный выход:

'AND':
output_array = [['Input 1 transitions to true', 'Input 2 is true',  'Input 3 is true'], 
                ['Input 1 is true', 'Input 2 transitions to true', 'Input 3 is true'], 
                ['Input 1 is true', 'Input 2 is true', 'Input 3 transitions to true'],]
'OR':
output_array = [['Input 1 transitions to true', 'Input 2 is false',  'Input 3 is false'], 
                ['Input 1 is false', 'Input 2 transitions to true', 'Input 3 is false'], 
                ['Input 1 is false', 'Input 2 is false', 'Input 3 transitions to true'],]

1 Ответ

0 голосов
/ 21 ноября 2019

Это должно работать как ожидалось:

def comb_gen(t_list, p_list, n_list, logic):
    if logic == 'OR':
        return [[p if j != i else s for j, p in enumerate(p_list)] for i, s in enumerate(t_list)]
    if logic == 'AND':
        return [[p if j != i else s for j, p in enumerate(n_list)] for i, s in enumerate(t_list)]

Вывод:

>>> t_list = ['Input 1 transitions to true', 'Input 2 transitions to true', 'Input 3 transitions to true']
>>> p_list = ['Input 1 is true', 'Input 2 is true', 'Input 3 is true']
>>> n_list = ['Input 1 is false', 'Input 2 is false', 'Input 3 is false']
>>> comb_gen(t_list, p_list, n_list, 'OR')
[['Input 1 transitions to true', 'Input 2 is true', 'Input 3 is true'],
 ['Input 1 is true', 'Input 2 transitions to true', 'Input 3 is true'],
 ['Input 1 is true', 'Input 2 is true', 'Input 3 transitions to true']]
>>> comb_gen(t_list, p_list, n_list, 'AND')
[['Input 1 transitions to true', 'Input 2 is false', 'Input 3 is false'],
 ['Input 1 is false', 'Input 2 transitions to true', 'Input 3 is false'],
 ['Input 1 is false', 'Input 2 is false', 'Input 3 transitions to true']]
...