Есть ли способ упростить эту функцию и как это может выглядеть? - PullRequest
0 голосов
/ 06 января 2020

Я полный нуб, и мне нужна помощь здесь:

Я всегда буду ввод (в AttributeList) 2-мерный вложенный список в эту функцию .

def CombineAttributes(AttributeList):



    NumAttributes = len(AttributeList)

        print("Got the following AttributeList: {}  , it has got {} Attributes in it and im going to Combine Everything now".format(AttributeList, NumAttributes) )



        if( NumAttributes > 10):
            print("MAXIMUM NUMBER OF 10 ATTRIBUTES REACHED")
        elif( NumAttributes == 1 ):
            List = [str(a) for a in AttributeList[0]]
        elif( NumAttributes == 2 ):
            List = [[str(a)+str(b) for a in AttributeList[0]] for b in AttributeList[1]]
        elif( NumAttributes == 3 ):
            List = [[str(a)+str(b)+str(c) for a in AttributeList[0]] for b in AttributeList[1] for c in AttributeList[2]]
        elif( NumAttributes == 4 ):
            List = [[str(a)+str(b)+str(c)+str(d) for a in AttributeList[0]] for b in AttributeList[1] for c in AttributeList[2] for d in AttributeList[3]]
        elif( NumAttributes == 5 ):
            List = [[str(a)+str(b)+str(c)+str(d)+str(e) for a in AttributeList[0]] for b in AttributeList[1] for c in AttributeList[2] for d in AttributeList[3] for e in AttributeList[4]]
        elif( NumAttributes == 6 ):
            List = [[str(a)+str(b)+str(c)+str(d)+str(e)+str(f) for a in AttributeList[0]] for b in AttributeList[1] for c in AttributeList[2] for d in AttributeList[3] for e in AttributeList[4] for f in AttributeList[5]]
        elif( NumAttributes == 7 ):
            List = [[str(a)+str(b)+str(c)+str(d)+str(e)+str(f)+str(g) for a in AttributeList[0]] for b in AttributeList[1] for c in AttributeList[2] for d in AttributeList[3] for e in AttributeList[4] for f in AttributeList[5] for g in AttributeList[6]]
        elif( NumAttributes == 8 ):
            List = [[str(a)+str(b)+str(c)+str(d)+str(e)+str(f)+str(g)+str(h) for a in AttributeList[0]] for b in AttributeList[1] for c in AttributeList[2] for d in AttributeList[3] for e in AttributeList[4] for f in AttributeList[5] for g in AttributeList[6] for h in AttributeList[7]]
        elif( NumAttributes == 9 ):
            List = [[str(a)+str(b)+str(c)+str(d)+str(e)+str(f)+str(g)+str(h)+str(i) for a in AttributeList[0]] for b in AttributeList[1] for c in AttributeList[2] for d in AttributeList[3] for e in AttributeList[4] for f in AttributeList[5] for g in AttributeList[6] for h in AttributeList[7] for i in AttributeList[8]]
        elif( NumAttributes == 10 ):
            List = [[str(a)+str(b)+str(c)+str(d)+str(e)+str(f)+str(g)+str(h)+str(i)+str(j) for a in AttributeList[0]] for b in AttributeList[1] for c in AttributeList[2] for d in AttributeList[3] for e in AttributeList[4] for f in AttributeList[5] for g in AttributeList[6] for h in AttributeList[7] for i in AttributeList[9] for j in AttributeList[10]]

        print("Im going to return the following after ive combined everything: {}".format(List))
        return List

пример входной вызов :

List = [['a','b','c','d'],[1,2,3,4]]
CombineAttributes(List)

вывод этого вызова:

Got the following AttributeList: [['a', 'b', 'c', 'd'], ['1', '2', '3', '4']]  , it has got 2 Attributes in it and im going to Combine Everything now
Im going to return the following after ive combined everything: [['a1', 'b1', 'c1', 'd1'], ['a2', 'b2', 'c2', 'd2'], ['a3', 'b3', 'c3', 'd3'], ['a4', 'b4', 'c4', 'd4']]

Я был бы рад, если бы я мог удалить максимальное количество атрибутов (NumAttributes) и если бы я мог удалить связку «если» и «элиф», чтобы сократить ее до пары строк, просматривая цикл список.

Пожалуйста, прокомментируйте неправильное понимание моего кода или моего вопроса. Мне интересно ваши ответы.

Ответы [ 2 ]

1 голос
/ 06 января 2020

Это альтернативный ответ с использованием itertools.product и понимания, который дает вам почти точный результат, который вы просили:

from pprint import pprint
from itertools import product

a = ['a', 'b', 'c', 'd']

b = ['1', '2', '3', '4']

axb = [
    [''.join(_) for _ in list(product(a, b))][_:_ + len(a)]
    for _ in range(0, len(a) * len(b), len(a))
]

pprint(axb)

В результате:

[['a1', 'a2', 'a3', 'a4'],
 ['b1', 'b2', 'b3', 'b4'],
 ['c1', 'c2', 'c3', 'c4'],
 ['d1', 'd2', 'd3', 'd4']]

Как видите, вам нужно будет транспонировать axb, чтобы получить точный результат. Это может быть достигнуто с помощью numpy.transpose(), например. Посмотрите:

>>> from numpy import transpose
>>> transpose(axb)
array([['a1', 'b1', 'c1', 'd1'],
       ['a2', 'b2', 'c2', 'd2'],
       ['a3', 'b3', 'c3', 'd3'],
       ['a4', 'b4', 'c4', 'd4']], dtype='<U2')
>>> 

Если вы хотите придерживаться стандартных модулей Python, вы можете транспонировать результат с помощью:

axbcopy = axb.copy()
for i in range(len(axb)):
    for j in range(len(axb[0])):
        axbcopy[i][j] = axb[j][i]

Или с более Pythoni c Метод:

axbt = list(map(list, zip(*axb)))

Где axbt будет содержать окончательный результат.

1 голос
/ 06 января 2020

Вы можете использовать продукт itertools здесь для генерации объединенных данных. обратите внимание, что возвращенная пара будет кортежем в списке, а не в списках.

def CombineAttributes(data):
    print(f"Got the following AttributeList: {data} its got {len(data)} Attributes in it and im going to Combine Everything now")
    merged = [[]]
    for pair in product(*data[::-1]):
        if len(merged[-1]) == len(data[0]):
            merged.append([])
        merged[-1].append("".join(str(ele) for ele in pair[::-1]))
    merged.sort()
    print("Im going to return the following after ive combined everything:", merged)
    return merged

data = [['a', 'b', 'c', 'd'], [1, 2, 3, 4]]
CombineAttributes(data)
data1 = [['a', 'b'], [1, 2], ['W', 'X']]
CombineAttributes(data1)

ВЫХОД

Got the following AttributeList: [['a', 'b', 'c', 'd'], [1, 2, 3, 4]] its got 2 Attributes in it and im going to Combine Everything now
Im going to return the following after ive combined everything: [['a1', 'b1', 'c1', 'd1'], ['a2', 'b2', 'c2', 'd2'], ['a3', 'b3', 'c3', 'd3'], ['a4', 'b4', 'c4', 'd4']]
Got the following AttributeList: [['a', 'b'], [1, 2], ['W', 'X']] its got 3 Attributes in it and im going to Combine Everything now
Im going to return the following after ive combined everything: [['a1W', 'b1W'], ['a1X', 'b1X'], ['a2W', 'b2W'], ['a2X', 'b2X']]
...