2013-03-13 66 views
3

所以我基本上有类似名称的元素非常大名单(C0,D0,C1,D1 ...等)我正在寻找一种简单的方法来生成Python代码

,我想知道如果是,将基本上生成一个脚本使用字符串

会改变一个字符串“C0”到实际的变量C0产生这些元素的简单的方法

我想避免使用列表,并会而是生成代码,因为与我的项目相关的原因

谢谢你们!

+3

现在你让我琢磨那些原因可能是什么,而不是你的代码生成的模板引擎...... – flup 2013-03-13 00:45:05

+3

毫无疑问,如果你有100个类似命名的变量,那么很有可能有一种解决顶级问题的更好方法... – 2013-03-13 00:45:19

+0

你能解释为什么要使用代码生成吗?代码生成可能不是解决此问题的最佳解决方案。 – 2013-03-13 00:48:10

回答

-1

实际上,你可以声明使用vars()以字符串格式的变量,文档here

例如,

如果我有列表,names

names = ['a','b','c','d'] 

我可以这样做:

for i,k in enumerate(names): 
    vars()[k] = i*2 #k is the names 

>>>print a 
0 
>>>print b 
2 
>>>print c 
4 

编辑

有使用exec文档here

for i,k in enumerate(names): 
    exec(k + '=%s' % i) #k is the names 

>>>print a 
0 
>>>print b 
1 
>>>print c 
2 
+3

您错过了文档中说“'注意,本地字典仅用于读取的部分,因为本地字典的更新被忽略。” - 它在这里工作的唯一原因是因为在全局名称空间中,当地人返回不被忽略的'globals'。 – mgilson 2013-03-13 00:53:48

-1

getattrlocals,并globals另一种方法。

如果你的变量是本地的功能,你可以这样做。如果您的变量是全局使用globals()

for i in len(100): 
    first_name = "c{0}".format(i) 
    second_name = "d{0}".format(i) 
    if(locals()[first_name] == locals()[second_name]): 
     print("hello") 
-1

你可以使用eval函数:

for i in xrange(100): 
    if eval('c%d' % i) == eval('d%d' % i): 
     print "Hello!" 
2

首先,不要拿这个,但我假设你根据你的问题的代码是新来的Python错误的方法:它不是有效的Python。遍布各地的大量Python教程 - 阅读了Python函数,内置函数和一般哲学。这是一个非常强大的语言,但它看起来像你继承的脚本是...不是非常Pythonic。一定不要从中学习有关语言的错误信息。

因此,理想情况下,您希望将所有这些变量收集在某种数据结构中。 Python有许多不同的类型。

如果您只需比较一组固定数据集中的每个索引,就可以避免使用元组:这些是有序的,不可变的集合,它暗示着一些结构。假设您有n数据对:您有两个元组,我们称它们为cd,但如果可以的话,使用描述性名称显然会更好。它应该是这样的:

c = (c0, c1, c2, ... cn) 
d = (d0, d1, d2, ... dn) 

而且你他们是这样的比较:

for i in range(len(c)): 
    if c[i] == d[i]: 
     print '%d: match' % i 
    else: 
     print '%d: no match' % i 

(两点需要注意:LEN()找到一个对象的长度,范围()创建一个可重复序列 - 你的问题使用len(),你想在Python中使用range(),并且%d的东西只是字符串格式。)

我的假设是你需要更多。首先,如果编写这个东西的人认为将数据存储为数百个独特的全局变量是一个好主意,那么我不会认为他会这样做,比如确保每个变量存在并在运行时保存数据等所以我个人在这种情况下使用字典,因为它给你更多的灵活性。

每个字典都是key:value对的集合。口号是无序的,所以你不能直接比较每一个中的第一个项目 - 没有第一个项目。 可以用做的是使用一个整数序列作为关键字,然后遍历该序列的范围。你可以做这样的事情有一个默认的检索值,这样你就不会崩溃的程序,如果C64从来没有得到声明:

c = {0:'a', 1:'b', 2:'c', 3:'d', 4:'r'} 
d = {0:'a', 1:'B', 2:None, 3:'d'} 

然后是这样的:

for i in range(len(c)): 
    if c.get(i, 'No value') == d.get(i, 'No value'): 
     print '%d: match' % i 
    else: 
     print '%d: no match' % i 

虽然你会通常从c[4]d['apple']这样的字典中检索数据。 Get()允许我们使用缺省值('No value'),以防缺失一些值i。 (另一个假设:每一对数据代表一些真实的数据关系,所以迭代次数在语义上是一个标签,就像它是一个索引一样,在我看来,键通常应该是标签而不是数值本身)

你在评论中提出的建议,将现有变量收集到这些结构之一中,可以正常工作。只需打开Notepad ++并使用源代码进行一些智能搜索/替换,应该花费10分钟。你最终会得到c = (c0, c1, c2, etc)c = {0:c0, 1:c1, etc},或者如果你找到另一种适合你的需求的结构,你会得到不同的结果。但是我真的认为你应该做的是重构整个脚本,以便你正在比较的数据存储在某种对象中,以反映它是什么以及如何使用它。 Python会让你在这里发挥真正的魔力:通过一点点修改,你可以做一些简单的事情,找到c == d,寻找联合或不相交的集合,找到在某些迭代中操纵数据值或者任何你想要的东西需要。

+0

谢谢你!我对python是半新的,我实际上知道那不是正确的python,我原本写它是正确的,我意识到它没有传达我想传达的想法。我认为写一本字典可能是我最好的选择。非常感谢你! – 2013-03-13 02:27:04

+0

@DanielImberman太棒了,我很高兴这让你走上正轨。我建议稍微修改一下你的问题,以反映你真的想要处理一个糟糕的无组织数据的脚本,而不是本身的代码生成。你可能会得到更多关于如何解决问题的指针。 – toxotes 2013-03-13 02:37:17

相关问题