【问题标题】:Set multiple similar variables in Python在 Python 中设置多个相似的变量
【发布时间】:2014-03-05 18:56:13
【问题描述】:

如何清理以下代码并使其看起来更好?

我想知道是否有一种方法可以将所有这些变量和值设置为更简单、更短的版本。这样做的例子是什么? :-)

import feedparser
import memcache
import sys

mc = memcache.Client(["127.0.0.1:11211"])
rss = feedparser.parse('http://example.com/example.rss')
song0 = rss.entries[0].title.encode('latin-1', 'replace').replace("?" , "-")
song1 = rss.entries[1].title.encode('latin-1', 'replace').replace("?" , "-")
song2 = rss.entries[2].title.encode('latin-1', 'replace').replace("?" , "-")
song3 = rss.entries[3].title.encode('latin-1', 'replace').replace("?" , "-")
song4 = rss.entries[4].title.encode('latin-1', 'replace').replace("?" , "-")
song5 = rss.entries[5].title.encode('latin-1', 'replace').replace("?" , "-")
song6 = rss.entries[6].title.encode('latin-1', 'replace').replace("?" , "-")
song7 = rss.entries[7].title.encode('latin-1', 'replace').replace("?" , "-")
song8 = rss.entries[8].title.encode('latin-1', 'replace').replace("?" , "-")
song9 = rss.entries[9].title.encode('latin-1', 'replace').replace("?" , "-")

mc.set("track0", song0);
mc.set("track1", song1);
mc.set("track2", song2);
mc.set("track3", song3);
mc.set("track4", song4);
mc.set("track5", song5);
mc.set("track6", song6);
mc.set("track7", song7);
mc.set("track8", song8);
mc.set("track9", song9);

【问题讨论】:

  • 这不是一个真正值得提问的问题,所以如果它被关闭也不要太惊讶。但是,rss 必须是可迭代的,因此对于可迭代的项目:do_something 它可以通过列表理解在一行中完成
  • 我主要找的但失败的是函数列表。

标签: python variables rss set


【解决方案1】:

您有 10 个名称相似的变量,仅相差一个数字。这是一个明确的信号,表明您真正想要使用的是一个列表:

songs = [i.title.encode("latin-1", "replace").replace("?" , "-") for i in rss.entries]

【讨论】:

    【解决方案2】:

    最干净(因此也是最好的)方式:

    import feedparser
    import memcache
    import sys
    
    mc = memcache.Client(["127.0.0.1:11211"])
    rss = feedparser.parse('http://example.com/example.rss')
    songs = [] # Initialize “songs” to the empty list
    for i in range(0, 10):
        # Add items in “songs”
        songs.append(rss.entries[i].title.encode('latin-1', 'replace').replace("?" , "-"))
    
    for (i, song) in enumerate(songs): # This is equivalent to “for i in range(0, len(songs)+1):” and “song = songs[i]”
        mc.set("track%i" % i, song);
    

    如果您真的想将歌曲保存在不同的变量中(我几乎可以肯定您实际上并不想这样做;此外,不建议使用它(请参阅有关此问题的 cmets)):

    import feedparser
    import memcache
    import sys
    
    mc = memcache.Client(["127.0.0.1:11211"])
    rss = feedparser.parse('http://example.com/example.rss')
    for i in range(0, 10):
        locals()['song%i' % i] = rss.entries[0].title.encode('latin-1', 'replace').replace("?" , "-")
    
    for i in range(0, 10):
        mc.set("track%i" % i, locals()['song%i' % i]);
    

    【讨论】:

    • 您是否真的尝试过第二种解决方案(使用locals())?我很确定这行不通。
    • 它适用于我的一个小例子(locals()['spam'] = 'egg'print(locals()['spam'])
    • 请看这个:stackoverflow.com/questions/10488296/… 即使它有效,文档也明确警告它不安全。
    • 请注意,您使用 locals() 的方式可以是任何字典 - 不必特别是本地人,因为您还可以通过在示例中取消引用 locals() 来获取值.事实上,这就是它的工作原理——如果你尝试直接访问变量song1,它将不起作用——它并没有真正添加到本地命名空间中。但是locals() 每次都返回相同的字典,所以你稍后会看到添加。
    • 我刚刚测试过,在完成locals()['spam'] = 'egg' 之后访问spam) 有效。 (但我同意医生说我们不应该依赖它)
    【解决方案3】:
    import feedparser
    import memcache
    import sys
    
    mc = memcache.Client(["127.0.0.1:11211"])
    rss = feedparser.parse('http://example.com/example.rss')
    song=[]
    for i in range(0,10):
        song[i] = rss.entries[i].title.encode('latin-1', 'replace').replace("?" , "-")
        mc.set("track"+str(i), song[i]);
    

    【讨论】:

      【解决方案4】:

      enumerate()rss.entries 一起使用将使您摆脱手动维护索引的负担。最重要的是,无论rss.entries 的长度如何,它都能正常工作。

      import feedparser
      import memcache
      import sys
      
      mc = memcache.Client(["127.0.0.1:11211"])
      rss = feedparser.parse('http://example.com/example.rss')
      
      song = []
      for i, entry in enumerate(rss.entries):
          title = entry.title.encode('latin-1', 'replace').replace("?" , "-")
          song.append(title)
          mc.set("track%d" % i, title)
      

      【讨论】:

      • 我必须用 song = {} 初始化列表,否则我会得到 IndexError: list index out of range
      • 你最终使用的是字典,而不是列表({} 代表字典文字)。更新了代码以使列表正常工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 2020-06-22
      • 2015-06-15
      相关资源
      最近更新 更多