объедините 2d-список с пониманием списка вместо цикла for

#python #list #list-comprehension

#питон #Список #понимание списка #python

Вопрос:

Привет, у меня есть 2d список, состоящий из 3 элементов, я объединил некоторые элементы, используя следующий код

     list1 = [(1,"hello",3),(1,"excelent",4),(2,"marvelous",3)]
    length = len(list1)
    text = ''
    for irow in range(length):
            number      = list1[irow][0]
            listText    = list1[irow][1]
            ids         = list1[irow][2]
            text  = "<tag id = "  str(ids) ">" str(listText) "<\tag>rn"
    
    print(text)
  

и это приводит к следующему результату

 <tag id = 3>hello<tag> 
<tag id = 4>excelent<tag> 
<tag id =3>marvelous<tag>
  

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

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

1. Где length определено?

2. Посмотрите, jinja templates нужен ли вам более сложный рендеринг..

Ответ №1:

Вы могли бы свести все это к однострочному, но я полагаю, что разумным компромиссом, вероятно, все еще является использование for цикла над вашим списком, но в for цели цикла вы можете распаковать подсписки непосредственно в соответствующие переменные. В любом случае нет необходимости выполнять цикл по индексу, а не по фактическому содержимому list1 . Использование f-строки (в последних версиях Python) также поможет навести порядок.

 list1 = [(1,"hello",3),(1,"excelent",4),(2,"marvelous",3)]

text = ''
for number, listText, ids in list1:
    text  = f'<tag id = {ids}>{listText}<\tag>rn'

print(text)
  

Вы также могли бы рассмотреть возможность использования обычной фиктивной переменной _ вместо number здесь, потому что на самом деле вы не используете значение:

 for _, listText, ids in list1:
  

Ответ №2:

Использование понимания списка:

 ee = [(1,"hello",3),(1,"excelent",4),(2,"marvelous",3)]
  
print(["<tag id = "  str(x[2]) ">" str(x[1]) "<tag>" for x in ee])
  

ВЫВОД:

 ['<tag id = 3>hello<tag>', '<tag id = 4>excelent<tag>', '<tag id = 3>marvelous<tag>']  
  

Редактировать:

Если вы хотите, чтобы в тексте тегов были двойные кавычки:

 print(["<tag id = "   str(x[2]) " >"   str('"'   x[1]   '"')   "<tag>" for x in ee])
  

ВЫВОД:

 ['<tag id = 3 >"hello"<tag>', '<tag id = 4 >"excelent"<tag>', '<tag id = 3 >"marvelous"<tag>'] 
  

Ответ №3:

Использование f-строк и распаковка элементов кортежа в понимании списка делает это легко читаемым:

 list1 = [
    (1, "hello", 3),
    (1, "excelent", 4),
    (2, "marvelous", 3),
]
texts = [
    f'<tag id="{ids}">{text}<\tag>'  # TODO: handle HTML quoting?
    for (number, text, ids) in list1
]
text = "rn".join(texts)
  

Ответ №4:

повторите лямбда-функцию и используйте map()

 list1 = [(1, "hello", 3), (1, "excelent", 4), (2, "marvelous", 3)]
text = map(lambda x: f'<tag id = {x[2]}>{x[1]}<\tag>', list1)
print('rn'.join(list(text)))
  

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

1. Есть много способов решить эту проблему, но использование функции map сделает ваш код чистым и читаемым.