2014-02-21 4 views
3

у меня есть что-то вроде этого, где trade_date, Effective_Date и termination_date финиковой значения:преобразования переменных в dictonaries

tradedates = dict(((k, k.strftime('%Y-%m-%d')) 
    for k in (trade_date,effective_date,termination_date))) 

я получаю это:

{datetime.date(2005, 7, 25): '2005-07-25', 
datetime.datetime(2005, 7, 27, 11, 26, 38): '2005-07-27', 
datetime.datetime(2010, 7, 26, 11, 26, 38): '2010-07-26'} 

То, что я хотел бы это:

{'trade_date':'2005-07-25','effective_date':'2005-07-27','termination_date':'2010-07-26'} 

Как это достичь?

+0

Да falsetru это правильно –

ответ

8

Использование vars:

>>> import datetime 
>>> 
>>> trade_date = datetime.date(2005, 7, 25) 
>>> effective_date = datetime.datetime(2005, 7, 27, 11, 26, 38) 
>>> termination_date = datetime.datetime(2010, 7, 26, 11, 26, 38) 
>>> 
>>> d = vars() # You can access the variable as d['name'] 
>>> tradedates = { 
...  name: d[name].strftime('%Y-%m-%d') 
...  for name in ('trade_date', 'effective_date', 'termination_date') 
... } 
>>> tradedates 
{'effective_date': '2005-07-27', 'termination_date': '2010-07-26', 'trade_date': '2005-07-25'} 
+0

Привет Спасибо ваш ответ правильный б ut вы можете объяснить, что такое d = vars() –

+0

Я добавил комментарий к коду. Или следуйте по ссылке в ответе. – falsetru

+0

Привет, что такое d = vars(), хотя я никогда не видел этот синтаксис когда-либо –

4

За то, что размер, я бы создать dict непосредственно:

result = { 
    'trade_date': format(trade_date, '%Y-%m-%d'), 
    'effective_date': format(effective_date, '%Y-%m-%d'), 
    # etc.... 
} 
+0

Привет Очень элегантное решение для начинающего, как я, чтобы понять –

+0

Извините, я не могу отметить два ответа правильно –

+0

@ jhon.smith nope - это нормально. Я бы лично выбрал фальсетру. Потратьте время, чтобы понять, почему/как работает решение, и все будет хорошо ... –

0

Я не уверен, если я получил свой вопрос прямо. Но позвольте мне объяснить, что я понял, и мой ответ на что:

Вы знаете имена переменных: trade_date, Effective_Date, termination_date И у них есть данные в них

Вы можете легко сделать:

tradedates = dict() 
for k in ('trade_date','effective_date','termination_date'): 
    tradedates[k] = eval(k).strftime('%Y-%m-%d')  // eval will evaluate them as a variable name not as a string. 

Это даст вам окончательный Dict что-то вроде:

{ 
    'trade_date': <date_string_according_to_the_format_above> 
    'effective_date': <date_string_according_to_the_format_above> 
    'termination_date': <date_string_according_to_the_format_above> 
} 
+1

Хотя это будет работать с использованием 'eval', здесь не рекомендуется -' vars/globals', как показано @falsetru, будет предпочтительным методом вместо этого вытащить из пространства имен ... –

+0

К сожалению - внесенное вами изменение. eval (k.strftime (...)) 'будет определять дату форматирования, вы хотите применить форматирование к результирующему объекту, ll в конечном итоге делает вычитание на элементе date - например, - сегодня будет: 'eval ('2014-02-21')', который дает '1991' :) –

+0

@JonClements Right. К сожалению, пропустили неуместные квадратные скобки. Починил это. Спасибо за указание. –

Смежные вопросы