#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 сделает ваш код чистым и читаемым.