代码之家  ›  专栏  ›  技术社区  ›  Srikar Appalaraju Tonetel

将列表分配到var中的更好方法

  •  4
  • Srikar Appalaraju Tonetel  · 技术社区  · 14 年前

    在用Python编写代码。有一段代码,想知道是否可以做得更优雅。。。

    # Statistics format is - done|remaining|200's|404's|size
    statf = open(STATS_FILE, 'r').read()
    starf = statf.strip().split('|')
    done  = int(starf[0])
    rema  = int(starf[1])
    succ  = int(starf[2])
    fails = int(starf[3])
    size  = int(starf[4])
    ...
    

    这样下去。我想知道在将行分割成一个列表之后,是否有更好的方法将每个列表分配到一个var中。我有将近30行将索引值分配给var。只是想学习更多关于Python的知识就这样。。。

    5 回复  |  直到 10 年前
        1
  •  6
  •   leoluk    14 年前
    done, rema, succ, fails, size, ... = [int(x) for x in starf]
    

    labels = ("done", "rema", "succ", "fails", "size")
    
    data = dict(zip(labels, [int(x) for x in starf]))
    
    print data['done']
    
        2
  •  5
  •   Glenn Maynard    14 年前

    到目前为止,我不喜欢答案的地方是,它们把所有的东西都用一个表达式来表达。您希望减少代码中的冗余,而不是一次做太多。

    如果行中的所有项都是int,那么将它们全部转换在一起,这样就不必编写 int(...)

    starf = [int(i) for i in starf]
    

    如果只有某些项目是整数(可能有些是字符串或浮点数),则可以仅转换这些项目:

    for i in 0,1,2,3,4:
        starf[i] = int(starf[i]))
    

    在块中赋值是很有用的;如果你有很多项——你说你有30项——你可以把它们分开:

    done, rema, succ = starf[0:2]
    fails, size = starf[3:4]
    
        3
  •  4
  •   Alex Martelli    14 年前

    我可以用 csv 带分隔符的模块 | int map 调用)获取整数。其他技巧包括使用 with 声明来打开文件,以确保它不会导致“文件描述符泄漏”(在当前的CPython版本中不是必不可少的,但对于可移植性和未来的证明是一个极好的主意)。

    collections.NamedTuple import this 在解释器提示下):“名称空间是一个非常好的主意——让我们做更多的工作吧!”。。。空名称有其(有限;-)的位置,但表示几十个相关值并不是一回事——相反,这种情况“迫切需要”使用“让我们做更多的事情”方法(即,添加 对相关字段进行适当的命名空间分组(这是组织数据的更好方法)。

        4
  •  0
  •   Ashley Grenon    14 年前

    keys = ("done", "rema", "succ" ... )
    somedict = dict(zip(keys, [int(v) for v in values]))
    

    那就行了。:-)也比30行好看:-)

    编辑:我认为现在有dict comphrensions,所以看起来可能更好了!:-)
    编辑第2部分:另外,对于keys集合,您需要将其分解为多个文件行。

        5
  •  0
  •   Srikar Appalaraju Tonetel    14 年前

    谢谢你的回答。下面是总结-

    1. done, rema, succ = starf[0:2] 等。
    2. 利用python强大的dict理解能力,Leoluk的方法更加简短和甜蜜。
    3. 汤森-和2一样