2016-11-21 47 views
1

让我编辑我的问题来澄清。下面是Python代码:如何在python中创建一个stata本地宏?

decade_begin = 1970 

while decade_begin <= 1994: 
    for x in range(0, 10): 
     a= decade_begin + x 
    decade_begin = a+1 
    decade_end=a 

print "year_",decade_begin,"s" #start year 

最后一行的输出是:

year_1980s 
year_1990s 

我希望能够创建一个变量,使得:

year_1990s = [a] 

在Stata这很容易,使用本地宏'x'。但在Python中,我认为混合字符串和int在变量名是不允许的。

forval i = 1979/1994 { 
whatever if year == `i' 
save year_`i'.dta, replace 
} 

有关如何在python中实现的任何想法?

+0

对于那些熟悉Python但不熟悉STATA的人,你能解释一下'x'是什么吗?你的意思是像[格式文字](http://stackoverflow.com/documentation/python/1019/string-formatting/4021/format-literals#t=201611212058243848285)? –

+0

我认为它在STATA被称为本地宏。我找到的最简单的解释是:https://www.ssc.wisc.edu/sscc/pubs/stata_prog1.htm – Carla

+0

它**被称为本地宏。这在源码http://www.stata.com/help.cgi?foreach上是非常明确的但我怀疑Stata [NB]术语是否有助于回答python问题,这是一个如何遍历列表的问题。 –

回答

1

喜欢的东西,这是一个大致相当于:

for x in ["apple", "banana", "orange"]: 
    with open(x + ".data", "w") as outfile: 
     outfile.write("whatever") 
0

如果我理解正确的话,你想创建使用字符串来命名变量变量名。 (相当于Stata中的本地宏在Python中称为变量)。您可以使用exec功能做到这一点:

>>> for i in range(1979, 1995): 
... exec("name_" + str(i) + " = " + str(i)) 

>>> print(name_1994) 
1994 

此代码假设你使用Python 3,如果你使用的是Python 2,去掉外括号与execprint线。

然而,使用exec并不是解决Python中这个问题的最好方法(如解释here)。如果您尝试使用Python进行代码编码的方式与以前在Stata中进行编码的方式相同,那么稍后您可能会遇到问题。

更好的方法可能是创建一个字典并为每个数字使用不同的密钥。例如:

>>> names = {} 
>>> for i in range(1979, 1995): 
... names[i] = i 
>>> print(names) 
{1979: 1979, 1980: 1980, 1981: 1981, 1982: 1982, 1983: 1983, 1984: 1984, 1985: 1985, 1986: 1986, 1987: 1987, 1988: 1988, 1989: 1989, 1990: 1990, 1991: 1991, 1992: 1992, 1993: 1993, 1994: 1994}