Я хочу преобразовать приведенный ниже список кортежей в одну строку, где выходная строка должна заменить datetime obj в строковый формат datetime None следует заменить на 'None', а целое число следует заменить на str (int)

rows = [('name', 25,  datetime.datetime(2018, 1, 9, 0, 0, 1), None), ('name2', 26,  datetime.datetime(2018, 1, 9, 0, 0, 1), None)]

Я хочу, чтобы ниже было записано как строка

'(('name', '25',  '2018-01-09 00:00:01', 'None'), ('name2', '26',  2018-01-09 00:00:01, 'None')]'

Ожидание:

'((str, str, str, str), (str, str, str, str))'

Я пробовал следовать

print('(%s)' % ','.join(str(i) for i in rows  ))

Но он не преобразуется в правильный формат. Я что-то упускаю

-1
Binit Amin 22 Сен 2021 в 15:57

2 ответа

Лучший ответ
import datetime
rows = [('name', 25,  datetime.datetime(2018, 1, 9, 0, 0, 1), None), ('name2', 26,  datetime.datetime(2018, 1, 9, 0, 0, 1), None)]
print(str(tuple(tuple(map(str, item)) for item in rows)))

Или если вы предпочитаете понимание списка вместо map()

print(str(tuple(tuple(str(ele) for ele in item) for item in rows)))
2
buran 22 Сен 2021 в 13:08

Похоже, ваш код преобразует каждый кортеж в списке в str, а не каждый элемент в кортежах .

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

>>> str(tuple(tuple(str(x) for x in r) for r in rows))
"(('name', '25', '2018-01-09 00:00:01', 'None'), ('name2', '26', '2018-01-09 00:00:01', 'None'))"

Обратите внимание, что есть два for ключевых слова, которые проходят через оба уровня вашей структуры.

1
saxbophone 22 Сен 2021 в 13:13