Как использовать один лайнер вместо «для цикла», который также содержит оператор if-else (приведен пример)

#python #loops #for-loop #if-statement #one-liner

Вопрос:

 if type(prevtag_pair) == list:
    word_tag=[]
    for row in prevtag_pair:
        c =0
        x =[]
        for col in row:
            y=[]
            for pair in col: 
                if len(pair[1])> 0:
                    y.append(pair[0]  '_' pair[1])
                else: 
                    y.append(pair[0]  '_' )
            x.append(y)
        word_tag.append(x)
    
 

Я хочу преобразовать его в одну строку. Но я получаю ошибку. любая помощь будет признательна.

 if type(prevtag_pair) == list:
    word_tag = [[y.append(pair[0]  '_' pair[1]) if len(pair[1])> 0 else y.append(pair[0]  '_' ) ] for row in prevtag_pair for col in row for pair in col]
 

Пожалуйста, исправьте это, если это возможно. Спасибо.

ДАННЫЕ ввода-ВЫВОДА:

[[[[‘вызов’, ‘г’], [‘возможность’, ‘г’], [‘преодоление’, ‘П’], [‘вызов’, ‘г’], [‘возможность’, ‘г’], [‘высшее’, ‘г’], [‘levelthan’, ‘а’]], [[‘страна’, ‘г’], [‘лицо’, ‘П’],
[‘этажность’, ‘Н’], [‘проблемы’, ‘а’], [‘демократия’, ‘а’],
[‘базовый’, ‘П’], [‘прогресс’, ‘а’]], [[‘проблемы’, ‘а’], [‘демократия’, ‘П’], [‘лица’, ‘Н’], [‘мир’, ‘г’], [‘Уровень’, ‘А’]], [[‘вызов’, ‘г’], [‘возможность’, ‘г’], [‘прогресс’, ‘а’], [‘заявление’, ‘г’], [‘раскрывается’, ‘Н’], [‘идея’, ‘Д’],
[‘вызов’, ‘г’], [‘сложности’, ‘г’], [‘трудности’, ‘а’],
[‘возможность’, ‘г’], [‘прогресс’, ‘а’], [‘вызов’, ‘г’],
[‘преодолеть’, ‘а’], [‘вызов’, ‘г’], [‘успех’, ‘П’],
[‘преодоление’, ‘А’], [‘подъем’, ‘а’], [‘высшее’, ‘Д’],
[‘уровень’, ‘А’], [‘процесса’, ‘а’]], [[‘проблемы’, [‘о’]],
[‘просветить’, ‘Н’], [‘интернет’, ‘П’], [‘стороны’, ‘Г’], [‘как’, ‘в’], [‘препятствия’, ‘а’], [‘новые освещает’, ‘П’], [‘позволять’, ‘П’], [‘лучший’, ‘П’], [‘результат’, ‘г’], [‘проблемы’, ‘П’], [‘как’, ‘в’], [‘возможность’, ‘г’], [‘прогресс’, ‘П’], [‘хочу’, ‘п’], [‘интернет’, ‘П’], [‘лихо’, ‘П’], [‘победный’, ‘В’],
[‘неудачник’, ‘с’], [‘жизнь’, ‘П’]], [[‘вызов’, ‘г’],
[‘проблемы’, ‘Г’], [‘возможность’, ‘г’], [‘прогресс’, ‘а’],
[‘meansa’, ‘Н’], [‘вызов’, ‘П’], [‘проблемы’, ‘Г’],
[‘помочь’, ‘г’], [‘развитие’, ‘г’], [‘экс’, ‘П’], [‘фермер’, ‘г’], [‘сложной’, ‘а’], [‘расти’, ‘П’], [‘растения’, ‘а’],
[‘С’, ‘Р’], [‘цель’, ‘П’], [‘помочь’, ‘в’], [‘развитие’, ‘а’]]]]

O/P: ошибка приходит как [нет],[нет],…..

Комментарии:

1. Не могли бы вы, пожалуйста, добавить ошибку?

2. Можете ли вы также добавить переменные типы данных или предоставить некоторые фиктивные данные?

3. наступает момент, когда сведение чего-либо к пониманию списка больше не имеет смысла. На мой взгляд, ваш фрагмент кода с тремя вложенными for циклами и if-else оператором выходит за рамки этого пункта.. Здесь нет строгого правила, но я бы сделал это только для последнего (самого внутреннего) for цикла. В противном случае вы жертвуете слишком большой удобочитаемостью.

Ответ №1:

Я надеюсь, что это может решить вашу проблему,

 for row in prevtag_pair:
    word_tag = [[f'{pair[0]}_{pair[1]}' if len(pair[1]) > 0 else f'{pair[0]}_' for pair in col] for col in row ]
    print(word_tag)
 

Выход:

 [['challenge_D', 'opportunity_D', 'overcoming_P', 'challenge_D', 'opportunity_D', 'higher_D', 'levelthan_A'], ['country_D', 'face_P', 'levels_N', 'challenges_A', 'democracy_A', 'foundational_P', 'progress_A'], ['challenges_A', 'democracy_P', 'faces_N', 'world_D', 'level_A'], ['challenge_D', 'opportunity_D', 'progress_A', 'statement_D', 'reveals_N', 'idea_D', 'challenge_D', 'difficulty_D', 'hardship_A', 'opportunity_D', 'progress_A', 'challenge_D', 'overcome_A', 'challenge_D', 'succeed_P', 'overcoming_A', 'rise_A', 'higher_D', 'level_A', 'progess_A'], ["challenges_['o']", 'enlight_N', 'deal_P', 'ways_D', 'like_A', 'obstacles_A', 'enlights_P', 'afford_P', 'best_P', 'result_D', 'challenges_P', 'like_A', 'opportunity_D', 'progress_P', 'want_P', 'deal_P', 'smartly_P', 
'victorious_V', 'looser_C', 'life_P'], ['challenge_D', 'problem_D', 'opportunity_D', 'progress_A', 'meansa_N', 'challenge_P', 'problem_D', 'help_D', 'development_D', 'ex_P', 'farmer_D', 'challenging_A', 'grow_P', 'plants_A', 'set_P', 'target_P', 'help_V', 'development_A']]
 

Ответ №2:

 word_tag = [[[f'{pair[0]}_{pair[1]}' if len(pair[1]) > 0 else f'{pair[0]}_' for pair in col] for col in row ]for row in prevtag_pair]
 

Это хорошо работает!

@Nanthakumar J J: Большое спасибо…

Комментарии:

1. @ Ma0: Спасибо за ваше доброе предложение. На самом деле мои данные размером до 50 ГБ. Вот почему я пытаюсь сократить время выполнения каждой возможной строки.