【问题标题】:Create if-elif statements using for loop使用 for 循环创建 if-elif 语句
【发布时间】:2013-06-30 06:42:30
【问题描述】:

我正在处理一个涉及多个 if 和 elif 条件的问题。准确地说,我的情况如下:

if len(g) == 2:
   a = 'rea: 300'
   b = 'ref: "%s": {"sds": 200},"%s": {"sds": 300}' % (g[0],g[1])

elif len(g) == 3:
   a = 'rea: 400'
   b = 'ref: "%s": {"sds": 200},"%s": {"sds": 300},"%s": {"sds": 400}' % (g[0],g[1],g[2])
....

这个 elif 条件应该上升到 elif len(g) == 99...所以我想应该有一些优雅的方法来做到这一点。此外,如果你观察,'rea' 和 'ref' 有一个模式在进行,可以表述为:

 if len(g) == x:
    a = 'rea: (x*100)+100'
    b = 'ref: "%s": {"sds": 200},"%s": {"sds": 300},"%s": {"sds": (x*100)+100}' % (g[0],g[1],g[2])

【问题讨论】:

  • b 应该是字典吗?为什么要将它重新创建为字符串?

标签: python if-statement for-loop


【解决方案1】:

可能是这样的:

g_len = len(g)
a = "rea: {}".format((g_len + 1) * 100)
b = "ref: "
for i, g_i in enumerate(g):
    b += ' "{}": {{"sds": {}}},'.format(g_i, (i+2) * 100)

【讨论】:

  • 这是迄今为止最优雅的一个..感谢 Mishik 和 Burhan! :-)
  • 还有一件事,伙计们..如何在 Python 2.6 或 2.4 上实现这一点?我相信可能会有一些语法变化..
  • 我不太记得 2.6 的问题。什么不工作?
  • IT 正在引发此异常:b += ' "{}": {{"sds": {}}},'.format(g_i, (i+2) * 100) ValueError:格式中的零长度字段名称
  • 嗯...我猜它不喜欢{}。尝试使用"{0}": {{"sds": {1}}},
【解决方案2】:

试试这个方法:

def func(g):
    if not 1 < len(g) < 100:
        raise ValueError('inadequate length')
    d = {x:{'sds':(i+2)*100} for i, x in enumerate(g)}
    a = 'rea: %s00' % (len(g)+1)
    b = 'ref: %s' % str(d)[1:-1]
    return (a, b)

我不知道你为什么要创建一个看起来很像字典的字符串b,但我相信你有你的理由......

>>> func(range(3))
('rea: 400', "ref: 0: {'sds': 200}, 1: {'sds': 300}, 2: {'sds': 400}")

【讨论】:

  • 谢谢玫瑰...真的很有帮助:-)
【解决方案3】:

使用字典:

x = 100
d = {}
for i in xrange(2, len(g)+1):
    d[i] = ['rea: {}'.format(100+x*i), 'ref: '+ ('%s: {"sds": 200}, ' *(i-1) + ' %s: {"sds": 200}') % tuple(g[:i])]

现在,d 看起来像:

{2: ['rea: 300',
     'ref: "depends_on_g": {"sds": 200}, "depends_on_g": {"sds": 300}'],
 3: ['rea: 400',
     'ref: "depends_on_g": {"sds": 200}, "depends_on_g": {"sds": 300}', "depends_on_g": {"sds": 300}]
 ...
}

然后,访问它:

a, b = d.get(len(g))

不需要 if 语句 :)

【讨论】:

  • "ref" 值应该为每个 i 增加
  • @mishik 我刚刚注意到 :)
  • 你现在有一个 n^2 大小的字典,存储了所有不需要的值 :)
  • @mishik 什么:p?首先,我的dict长度为98,其次,它从g获取内容。
  • dict 的长度是 98,但 d[1] 是 X 长,d[1] 是 2X 长,等等... d[99] ix 99X 长 :) X + 2X + ... + 99X = 4950X跨度>
【解决方案4】:

就我个人而言,在已知长度时,我会选择一些实用的东西,例如:

def do_Condition(g):
    """ Condtion the result based on the length of g """
    l = len(g)
    a = 'rea: %d' % (100 + 100*l)
    items = ['ref: "%s"' % (g[0])]
    n = 100
    for i in g[1:]:
        n += 100
        items.append('{"sds": %d},"%s"' % (n, i))
    b = ': '.join(items)
    return (a, b)

【讨论】:

  • 你不需要将len(g)存储为变量,长度总是计算出来的,在容器上调用length方法不会每次都重新计算,它只检索值,将长度存储为单独的值实际上更慢
【解决方案5】:

这似乎有效:

a = 'rea: %d00' % (len(g)+1)
b = ",".join(['ref: "%s": {"sds": %d00}' % (i, j) for i, j in  zip(g, range(2,len(g)+2))])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2021-10-31
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2020-08-30
    相关资源
    最近更新 更多