创建字典的最佳方法,该字典将包含给定值和日期范围的所有可能性?



我写了下面的脚本来做上面提到的。

from datetime import datetime, timedelta
def prv( name, arg ):
print( f'n{name} -> {type(arg)} -> {arg}' )
def pri( name, arg ):
print( f'n{name} -> {len(arg)} -> {arg}' )
def convert_str_to_pydate ( date, dateformat="%d/%m/%Y"):
refdate = datetime.strptime( date, dateformat )
return refdate
def main():
start_date = convert_str_to_pydate( '1/03/2020' )
last_date = convert_str_to_pydate( '5/03/2020' )
period = (last_date - start_date).days + 1
prv( 'period', period) 
period_dates = [ start_date + timedelta(days=x) for x in range( period ) ]
pri( 'period_dates', period_dates) 
values = [ i for i in range(3,0,-1) ]
pri( 'values', values) 
count = 0
for i in period_dates:
for v1 in values:
for v2 in values:
b = { i:v1 for i in period_dates }
b[i] = v2
print( count, b )
count += 1
main()

它返回以下内容:

period -> <class 'int'> -> 5
period_dates -> 5 -> [datetime.datetime(2020, 3, 1, 0, 0), datetime.datetime(2020, 3, 2, 0, 0), datetime.datetime(2020, 3, 3, 0, 0), datetime.datetime(2020, 3, 4, 0, 0), datetime.datetime(2020, 3, 5, 0, 0)]
values -> 3 -> [3, 2, 1]
0 {datetime.datetime(2020, 3, 1, 0, 0): 3, datetime.datetime(2020, 3, 2, 0, 0): 3, datetime.datetime(2020, 3, 3, 0, 0): 3, datetime.datetime(2020, 3, 4, 0, 0): 3, datetime.datetime(2020, 3, 5, 0, 0): 3}
1 {datetime.datetime(2020, 3, 1, 0, 0): 2, datetime.datetime(2020, 3, 2, 0, 0): 3, datetime.datetime(2020, 3, 3, 0, 0): 3, datetime.datetime(2020, 3, 4, 0, 0): 3, datetime.datetime(2020, 3, 5, 0, 0): 3}
2 {datetime.datetime(2020, 3, 1, 0, 0): 1, datetime.datetime(2020, 3, 2, 0, 0): 3, datetime.datetime(2020, 3, 3, 0, 0): 3, datetime.datetime(2020, 3, 4, 0, 0): 3, datetime.datetime(2020, 3, 5, 0, 0): 3}
3 {datetime.datetime(2020, 3, 1, 0, 0): 3, datetime.datetime(2020, 3, 2, 0, 0): 2, datetime.datetime(2020, 3, 3, 0, 0): 2, datetime.datetime(2020, 3, 4, 0, 0): 2, datetime.datetime(2020, 3, 5, 0, 0): 2}
4 {datetime.datetime(2020, 3, 1, 0, 0): 2, datetime.datetime(2020, 3, 2, 0, 0): 2, datetime.datetime(2020, 3, 3, 0, 0): 2, datetime.datetime(2020, 3, 4, 0, 0): 2, datetime.datetime(2020, 3, 5, 0, 0): 2}
5 {datetime.datetime(2020, 3, 1, 0, 0): 1, datetime.datetime(2020, 3, 2, 0, 0): 2, datetime.datetime(2020, 3, 3, 0, 0): 2, datetime.datetime(2020, 3, 4, 0, 0): 2, datetime.datetime(2020, 3, 5, 0, 0): 2}
6 {datetime.datetime(2020, 3, 1, 0, 0): 3, datetime.datetime(2020, 3, 2, 0, 0): 1, datetime.datetime(2020, 3, 3, 0, 0): 1, datetime.datetime(2020, 3, 4, 0, 0): 1, datetime.datetime(2020, 3, 5, 0, 0): 1}
7 {datetime.datetime(2020, 3, 1, 0, 0): 2, datetime.datetime(2020, 3, 2, 0, 0): 1, datetime.datetime(2020, 3, 3, 0, 0): 1, datetime.datetime(2020, 3, 4, 0, 0): 1, datetime.datetime(2020, 3, 5, 0, 0): 1}
8 {datetime.datetime(2020, 3, 1, 0, 0): 1, datetime.datetime(2020, 3, 2, 0, 0): 1, datetime.datetime(2020, 3, 3, 0, 0): 1, datetime.datetime(2020, 3, 4, 0, 0): 1, datetime.datetime(2020, 3, 5, 0, 0): 1}
9 {datetime.datetime(2020, 3, 1, 0, 0): 3, datetime.datetime(2020, 3, 2, 0, 0): 3, datetime.datetime(2020, 3, 3, 0, 0): 3, datetime.datetime(2020, 3, 4, 0, 0): 3, datetime.datetime(2020, 3, 5, 0, 0): 3}
10 {datetime.datetime(2020, 3, 1, 0, 0): 3, datetime.datetime(2020, 3, 2, 0, 0): 2, datetime.datetime(2020, 3, 3, 0, 0): 3, datetime.datetime(2020, 3, 4, 0, 0): 3, datetime.datetime(2020, 3, 5, 0, 0): 3}
11 {datetime.datetime(2020, 3, 1, 0, 0): 3, datetime.datetime(2020, 3, 2, 0, 0): 1, datetime.datetime(2020, 3, 3, 0, 0): 3, datetime.datetime(2020, 3, 4, 0, 0): 3, datetime.datetime(2020, 3, 5, 0, 0): 3}
12 {datetime.datetime(2020, 3, 1, 0, 0): 2, datetime.datetime(2020, 3, 2, 0, 0): 3, datetime.datetime(2020, 3, 3, 0, 0): 2, datetime.datetime(2020, 3, 4, 0, 0): 2, datetime.datetime(2020, 3, 5, 0, 0): 2}
13 {datetime.datetime(2020, 3, 1, 0, 0): 2, datetime.datetime(2020, 3, 2, 0, 0): 2, datetime.datetime(2020, 3, 3, 0, 0): 2, datetime.datetime(2020, 3, 4, 0, 0): 2, datetime.datetime(2020, 3, 5, 0, 0): 2}
14 {datetime.datetime(2020, 3, 1, 0, 0): 2, datetime.datetime(2020, 3, 2, 0, 0): 1, datetime.datetime(2020, 3, 3, 0, 0): 2, datetime.datetime(2020, 3, 4, 0, 0): 2, datetime.datetime(2020, 3, 5, 0, 0): 2}
15 {datetime.datetime(2020, 3, 1, 0, 0): 1, datetime.datetime(2020, 3, 2, 0, 0): 3, datetime.datetime(2020, 3, 3, 0, 0): 1, datetime.datetime(2020, 3, 4, 0, 0): 1, datetime.datetime(2020, 3, 5, 0, 0): 1}
16 {datetime.datetime(2020, 3, 1, 0, 0): 1, datetime.datetime(2020, 3, 2, 0, 0): 2, datetime.datetime(2020, 3, 3, 0, 0): 1, datetime.datetime(2020, 3, 4, 0, 0): 1, datetime.datetime(2020, 3, 5, 0, 0): 1}
17 {datetime.datetime(2020, 3, 1, 0, 0): 1, datetime.datetime(2020, 3, 2, 0, 0): 1, datetime.datetime(2020, 3, 3, 0, 0): 1, datetime.datetime(2020, 3, 4, 0, 0): 1, datetime.datetime(2020, 3, 5, 0, 0): 1}
18 {datetime.datetime(2020, 3, 1, 0, 0): 3, datetime.datetime(2020, 3, 2, 0, 0): 3, datetime.datetime(2020, 3, 3, 0, 0): 3, datetime.datetime(2020, 3, 4, 0, 0): 3, datetime.datetime(2020, 3, 5, 0, 0): 3}
19 {datetime.datetime(2020, 3, 1, 0, 0): 3, datetime.datetime(2020, 3, 2, 0, 0): 3, datetime.datetime(2020, 3, 3, 0, 0): 2, datetime.datetime(2020, 3, 4, 0, 0): 3, datetime.datetime(2020, 3, 5, 0, 0): 3}
20 {datetime.datetime(2020, 3, 1, 0, 0): 3, datetime.datetime(2020, 3, 2, 0, 0): 3, datetime.datetime(2020, 3, 3, 0, 0): 1, datetime.datetime(2020, 3, 4, 0, 0): 3, datetime.datetime(2020, 3, 5, 0, 0): 3}
21 {datetime.datetime(2020, 3, 1, 0, 0): 2, datetime.datetime(2020, 3, 2, 0, 0): 2, datetime.datetime(2020, 3, 3, 0, 0): 3, datetime.datetime(2020, 3, 4, 0, 0): 2, datetime.datetime(2020, 3, 5, 0, 0): 2}
22 {datetime.datetime(2020, 3, 1, 0, 0): 2, datetime.datetime(2020, 3, 2, 0, 0): 2, datetime.datetime(2020, 3, 3, 0, 0): 2, datetime.datetime(2020, 3, 4, 0, 0): 2, datetime.datetime(2020, 3, 5, 0, 0): 2}
23 {datetime.datetime(2020, 3, 1, 0, 0): 2, datetime.datetime(2020, 3, 2, 0, 0): 2, datetime.datetime(2020, 3, 3, 0, 0): 1, datetime.datetime(2020, 3, 4, 0, 0): 2, datetime.datetime(2020, 3, 5, 0, 0): 2}
24 {datetime.datetime(2020, 3, 1, 0, 0): 1, datetime.datetime(2020, 3, 2, 0, 0): 1, datetime.datetime(2020, 3, 3, 0, 0): 3, datetime.datetime(2020, 3, 4, 0, 0): 1, datetime.datetime(2020, 3, 5, 0, 0): 1}
25 {datetime.datetime(2020, 3, 1, 0, 0): 1, datetime.datetime(2020, 3, 2, 0, 0): 1, datetime.datetime(2020, 3, 3, 0, 0): 2, datetime.datetime(2020, 3, 4, 0, 0): 1, datetime.datetime(2020, 3, 5, 0, 0): 1}
26 {datetime.datetime(2020, 3, 1, 0, 0): 1, datetime.datetime(2020, 3, 2, 0, 0): 1, datetime.datetime(2020, 3, 3, 0, 0): 1, datetime.datetime(2020, 3, 4, 0, 0): 1, datetime.datetime(2020, 3, 5, 0, 0): 1}
27 {datetime.datetime(2020, 3, 1, 0, 0): 3, datetime.datetime(2020, 3, 2, 0, 0): 3, datetime.datetime(2020, 3, 3, 0, 0): 3, datetime.datetime(2020, 3, 4, 0, 0): 3, datetime.datetime(2020, 3, 5, 0, 0): 3}
28 {datetime.datetime(2020, 3, 1, 0, 0): 3, datetime.datetime(2020, 3, 2, 0, 0): 3, datetime.datetime(2020, 3, 3, 0, 0): 3, datetime.datetime(2020, 3, 4, 0, 0): 2, datetime.datetime(2020, 3, 5, 0, 0): 3}
29 {datetime.datetime(2020, 3, 1, 0, 0): 3, datetime.datetime(2020, 3, 2, 0, 0): 3, datetime.datetime(2020, 3, 3, 0, 0): 3, datetime.datetime(2020, 3, 4, 0, 0): 1, datetime.datetime(2020, 3, 5, 0, 0): 3}
30 {datetime.datetime(2020, 3, 1, 0, 0): 2, datetime.datetime(2020, 3, 2, 0, 0): 2, datetime.datetime(2020, 3, 3, 0, 0): 2, datetime.datetime(2020, 3, 4, 0, 0): 3, datetime.datetime(2020, 3, 5, 0, 0): 2}
31 {datetime.datetime(2020, 3, 1, 0, 0): 2, datetime.datetime(2020, 3, 2, 0, 0): 2, datetime.datetime(2020, 3, 3, 0, 0): 2, datetime.datetime(2020, 3, 4, 0, 0): 2, datetime.datetime(2020, 3, 5, 0, 0): 2}
32 {datetime.datetime(2020, 3, 1, 0, 0): 2, datetime.datetime(2020, 3, 2, 0, 0): 2, datetime.datetime(2020, 3, 3, 0, 0): 2, datetime.datetime(2020, 3, 4, 0, 0): 1, datetime.datetime(2020, 3, 5, 0, 0): 2}
33 {datetime.datetime(2020, 3, 1, 0, 0): 1, datetime.datetime(2020, 3, 2, 0, 0): 1, datetime.datetime(2020, 3, 3, 0, 0): 1, datetime.datetime(2020, 3, 4, 0, 0): 3, datetime.datetime(2020, 3, 5, 0, 0): 1}
34 {datetime.datetime(2020, 3, 1, 0, 0): 1, datetime.datetime(2020, 3, 2, 0, 0): 1, datetime.datetime(2020, 3, 3, 0, 0): 1, datetime.datetime(2020, 3, 4, 0, 0): 2, datetime.datetime(2020, 3, 5, 0, 0): 1}
35 {datetime.datetime(2020, 3, 1, 0, 0): 1, datetime.datetime(2020, 3, 2, 0, 0): 1, datetime.datetime(2020, 3, 3, 0, 0): 1, datetime.datetime(2020, 3, 4, 0, 0): 1, datetime.datetime(2020, 3, 5, 0, 0): 1}
36 {datetime.datetime(2020, 3, 1, 0, 0): 3, datetime.datetime(2020, 3, 2, 0, 0): 3, datetime.datetime(2020, 3, 3, 0, 0): 3, datetime.datetime(2020, 3, 4, 0, 0): 3, datetime.datetime(2020, 3, 5, 0, 0): 3}
37 {datetime.datetime(2020, 3, 1, 0, 0): 3, datetime.datetime(2020, 3, 2, 0, 0): 3, datetime.datetime(2020, 3, 3, 0, 0): 3, datetime.datetime(2020, 3, 4, 0, 0): 3, datetime.datetime(2020, 3, 5, 0, 0): 2}
38 {datetime.datetime(2020, 3, 1, 0, 0): 3, datetime.datetime(2020, 3, 2, 0, 0): 3, datetime.datetime(2020, 3, 3, 0, 0): 3, datetime.datetime(2020, 3, 4, 0, 0): 3, datetime.datetime(2020, 3, 5, 0, 0): 1}
39 {datetime.datetime(2020, 3, 1, 0, 0): 2, datetime.datetime(2020, 3, 2, 0, 0): 2, datetime.datetime(2020, 3, 3, 0, 0): 2, datetime.datetime(2020, 3, 4, 0, 0): 2, datetime.datetime(2020, 3, 5, 0, 0): 3}
40 {datetime.datetime(2020, 3, 1, 0, 0): 2, datetime.datetime(2020, 3, 2, 0, 0): 2, datetime.datetime(2020, 3, 3, 0, 0): 2, datetime.datetime(2020, 3, 4, 0, 0): 2, datetime.datetime(2020, 3, 5, 0, 0): 2}
41 {datetime.datetime(2020, 3, 1, 0, 0): 2, datetime.datetime(2020, 3, 2, 0, 0): 2, datetime.datetime(2020, 3, 3, 0, 0): 2, datetime.datetime(2020, 3, 4, 0, 0): 2, datetime.datetime(2020, 3, 5, 0, 0): 1}
42 {datetime.datetime(2020, 3, 1, 0, 0): 1, datetime.datetime(2020, 3, 2, 0, 0): 1, datetime.datetime(2020, 3, 3, 0, 0): 1, datetime.datetime(2020, 3, 4, 0, 0): 1, datetime.datetime(2020, 3, 5, 0, 0): 3}
43 {datetime.datetime(2020, 3, 1, 0, 0): 1, datetime.datetime(2020, 3, 2, 0, 0): 1, datetime.datetime(2020, 3, 3, 0, 0): 1, datetime.datetime(2020, 3, 4, 0, 0): 1, datetime.datetime(2020, 3, 5, 0, 0): 2}
44 {datetime.datetime(2020, 3, 1, 0, 0): 1, datetime.datetime(2020, 3, 2, 0, 0): 1, datetime.datetime(2020, 3, 3, 0, 0): 1, datetime.datetime(2020, 3, 4, 0, 0): 1, datetime.datetime(2020, 3, 5, 0, 0): 1}

但是,有以下重复输出:

回路
  • 0 输出在回路 9、18、27 和 36 重复 4 次。
  • 回路 4
  • 输出在回路 13、22、31 和 40 重复 4 次。
  • 回路
  • 8 输出在回路 17、26、35 和 44 重复 4 次。

问题:

  1. 如何在不将它们存储在集合或列表中的情况下避免这些重复?

  2. 在 python3 中执行此操作的最佳方法是什么?

按照@chepner的建议,我的脚本应该修改为:

from datetime import datetime, timedelta
from itertools import product
def prv( name, arg ):
print( f'n{name} -> {type(arg)} -> {arg}' )
def pri( name, arg ):
print( f'n{name} -> {len(arg)} -> {arg}' )
def convert_str_to_pydate ( date, dateformat="%d/%m/%Y"):
refdate = datetime.strptime( date, dateformat )
return refdate
def main():
start_date = convert_str_to_pydate( '1/03/2020' )
last_date = convert_str_to_pydate( '5/03/2020' )
period = (last_date - start_date).days + 1
prv( 'period', period) 
period_dates = [ start_date + timedelta(days=x) for x in range( period ) ]
pri( 'period_dates', period_dates) 
values = [ i for i in range(3,0,-1) ]
pri( 'values', values) 
print('nUsing itertools.product')
for count, i in enumerate( product( values, repeat=len(period_dates) ) ):
desired = i[::-1] # reverse the tuple i
b = { x:desired[n] for n, x in enumerate( period_dates ) }
print( count, b )

最新更新