L oop в списке кортежей, соединяющих элементы каждого кортежа - PullRequest
0 голосов
/ 24 апреля 2020

Я пытался сделать этот код лучше / быстрее и более устойчивым, но пока не смог его улучшить.

По сути, мне нужно l oop в списке кортежей и объединить каждый элемент кортежа с выражением фильтра dataframe точно так, как показано в решении. Однако кортежи в моем списке не имеют одинаковую длину, и они могут меняться и иметь разную длину, иногда я могу получить кортежи с менее чем 4 элементами в каждом, иногда более 6 или даже 7/8 и т. Д. на.

Мое решение работает, но мне нужно будет редактировать каждый раз, когда увеличивается длина моих кортежей, и я знаю, что это не самое эффективное решение. Как бы я итерировал внутри кортежей, используя длину каждого кортежа в мою пользу, чтобы избежать вложенных ifs?

Цените ваши советы и комментарии

Фактический список:

 Comb = [(),
 ('RD00',),
 ('RDC2',),
 ('RDC3',),
 ('RDC4',),
 ('RD00', 'RDC2'),
 ('RD00', 'RDC3'),
 ('RD00', 'RDC4'),
 ('RDC2', 'RDC3'),
 ('RDC2', 'RDC4'),
 ('RDC3', 'RDC4'),
 ('RD00', 'RDC2', 'RDC3'),
 ('RD00', 'RDC2', 'RDC4'),
 ('RD00', 'RDC3', 'RDC4'),
 ('RDC2', 'RDC3', 'RDC4'),
 ('RD00', 'RDC2', 'RDC3', 'RDC4')]

Я придумал это Решение , мне нужно объединить элементы кортежей в каждом кортеже и добавить выражение перед каждым элементом в кортеже:

 for p in comb:
    if len(p) == 1:
        print(''"(fF2_Principal['Messagetype']=="'{}'.format("'"+p[0]+"')"))
    if len(p) == 2:
        print(''"(fF2_Principal['Messagetype']=="'{} & '"   (fF2_Principal['Messagetype']=="'{}'.format("'"+p[0]+"')", "'"+p[1]+"')"))
    elif len(p) == 3:
        print(''"(fF2_Principal['Messagetype']=="'{} & '"(fF2_Principal['Messagetype']=="'{} & '"(fF2_Principal['Messagetype']=="'{}'.format("'"+p[0]+"')", "'"+p[1]+"')","'"+p[2]+"')"))
    elif len(p) == 4:
        print(''"(fF2_Principal['Messagetype']=="'{} & '"(fF2_Principal['Messagetype']=="'{} & '" (fF2_Principal['Messagetype']=="'{} & '"(fF2_Principal['Messagetype']=="'{}'.format("'"+p[0]+"')", "'"+p[1]+"')","'"+p[2]+"')","'"+p[3]+"')"))
    elif len(p) == 5: # not done yet, my previous data had 5 elements in one tuple
        print('{} : {} : {} : {} : {}'.format(p[0], p[1],p[2],p[3],p[4])) 

Приведенный выше код генерирует следующие результаты, которые работают для моей цели, однако я не могу отслеживать данные, чтобы увидеть, когда будет присутствовать другая длина кортежей.
Результаты :

    (fF2_Principal['Messagetype']=='RD00')
    (fF2_Principal['Messagetype']=='RDC2')
    (fF2_Principal['Messagetype']=='RDC3')
    (fF2_Principal['Messagetype']=='RDC4')
    (fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC2')
    (fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC3')
    (fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC4')
    (fF2_Principal['Messagetype']=='RDC2') & (fF2_Principal['Messagetype']=='RDC3')
    (fF2_Principal['Messagetype']=='RDC2') & (fF2_Principal['Messagetype']=='RDC4')
    (fF2_Principal['Messagetype']=='RDC3') & (fF2_Principal['Messagetype']=='RDC4')
    (fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC2') & 
    (fF2_Principal['Messagetype']=='RDC3')
    (fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC2') & 
    (fF2_Principal['Messagetype']=='RDC4')
    (fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC3') & 
    (fF2_Principal['Messagetype']=='RDC4')
    (fF2_Principal['Messagetype']=='RDC2') & (fF2_Principal['Messagetype']=='RDC3') & 
    (fF2_Principal['Messagetype']=='RDC4')
    (fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC2') & 
    (fF2_Principal['Messagetype']=='RDC3') & (fF2_Principal['Messagetype']=='RDC4')

Очень ценю ваши комментарии и советы, как улучшить этот код и сделать его более устойчивым.

1 Ответ

4 голосов
/ 24 апреля 2020

Самый простой способ сделать это - использовать понимание списка (чтобы написать каждую запись в тексте кортежа по отдельности) вместе с str.join(), чтобы соединить произвольное число из них вместе.

>>> for tup in Comb:
...     msg = " & ".join(
...         f"(fF2_Principal['Messagetype']=='{e}')" for e in tup
...     )
...     print(msg)
...

(fF2_Principal['Messagetype']=='RD00')
(fF2_Principal['Messagetype']=='RDC2')
(fF2_Principal['Messagetype']=='RDC3')
(fF2_Principal['Messagetype']=='RDC4')
(fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC2')
(fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC3')
(fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC4')
(fF2_Principal['Messagetype']=='RDC2') & (fF2_Principal['Messagetype']=='RDC3')
(fF2_Principal['Messagetype']=='RDC2') & (fF2_Principal['Messagetype']=='RDC4')
(fF2_Principal['Messagetype']=='RDC3') & (fF2_Principal['Messagetype']=='RDC4')
(fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC2') & (fF2_Principal['Messagetype']=='RDC3')
(fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC2') & (fF2_Principal['Messagetype']=='RDC4')
(fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC3') & (fF2_Principal['Messagetype']=='RDC4')
(fF2_Principal['Messagetype']=='RDC2') & (fF2_Principal['Messagetype']=='RDC3') & (fF2_Principal['Messagetype']=='RDC4')
(fF2_Principal['Messagetype']=='RD00') & (fF2_Principal['Messagetype']=='RDC2') & (fF2_Principal['Messagetype']=='RDC3') & (fF2_Principal['Messagetype']=='RDC4')

You ' Отметим, что это приводит к пустой строке для первого элемента. Если вы не хотите ничего печатать, даже пустую строку, тогда вы можете добавить if len(e) > 0 в конец описания сразу после for e in tup, что отфильтрует кортежи, если они содержат 0 элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...