所以我基本上有一个非常大的具有相似名称的元素列表(c0、d0、c1、d1 ...等)
我想知道是否有一种更简单的方法可以本质上生成一个脚本来使用字符串生成这些元素中的每一个
这会将字符串“c0”更改为实际变量 c0
由于与我的项目相关的原因,我想避免使用列表而宁愿生成代码
多谢你们!
首先,不要采取这种错误的方式,但我假设您是基于您问题中的代码的 Python 新手:它不是有效的 Python。到处都有大量优秀的 Python 教程——阅读 Python 函数、内置函数和一般哲学。它是一种非常强大的语言,但看起来你继承的脚本......不是很 Pythonic。确保不要从中学到关于语言的错误信息。
因此,理想情况下,您希望所有这些变量都收集在某种数据结构中。Python 有很多不同的类型。
如果您需要做的只是比较一对固定数据集中的每个索引,则可以使用元组:它们是有序的、不可变的集合,暗示了一些结构。假设您有n对数据:您有两个元组,我们称它们为c和d,但如果可以的话,使用描述性名称显然更好。它看起来像这样:
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() 找到对象的长度,range() 创建一个可交互的序列——在你的问题使用 len() 的地方,你想在 Python 中使用 range()。另外,%d 的东西是只是字符串格式。)
我的假设是,您需要做的还不止这些。一方面,如果写这个东西的人认为将数据存储为数百个唯一的全局变量是个好主意,我不会认为他会考虑在运行时执行诸如确保每个变量存在并保存数据等事情因此,在这种情况下,我个人会使用字典,因为它为您提供了更多的灵活性。
每个 dict 都是 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]
or的字典中检索数据d['apple']
。Get() 让我们使用默认值(“无值”),以防i的某些值丢失。
(另一个假设:每对数据代表一些真实的数据关系,因此迭代次数在语义上是一个标签,就像它是一个索引一样。在我看来,键通常应该是标签而不是值本身。)
您在评论中建议的将现有变量收集到这些结构之一中可以正常工作。只需打开 Notepad++ 并用您的源代码进行一些智能搜索/替换,应该会花费您十分钟。如果您找到适合您需要的另一种结构,您最终会得到c = (c0, c1, c2, etc)
or或不同的东西。c = {0:c0, 1:c1, etc}
但我真正认为您应该做的是重构整个脚本,以便您比较的数据存储在某种对象中,该对象反映它是什么以及您如何使用它。Python 将让你在这里发挥真正的魔力:通过一些繁琐的工作,你可以做一些简单的事情,比如找到c和dc == d
的联合或不相交集,在某些迭代中操作数据值,或者任何你需要的事情。
您可以使用 eval 函数:
for i in xrange(100):
if eval('c%d' % i) == eval('d%d' % i):
print "Hello!"