【问题标题】:Creating lists with loops in Python在 Python 中创建带有循环的列表
【发布时间】:2016-02-26 13:52:08
【问题描述】:

我正在尝试创建一系列具有不同变量名称的列表,这些变量名称对应于文本文件的不同行。我当前的代码要求我硬编码文件中的行数:

with open('ProjectEuler11Data.txt') as numbers:
    data = numbers.readlines()
    for line in data:
        if line == 1:
            line1 = line.split()
        if line == 2:
            line2 = line.split()
        if line == 3:
            line3 = line.split()
        if line == 4:
            line4 = line.split()

在这种情况下,我必须持续到 20 次,这还不错,但我想还有一种我不知道的更简单的方法。 这是针对 ProjectEuler 问题的,但没有任何剧透,而且我正在寻找有关此特定任务的建议,而不是我的整体策略。谢谢!

【问题讨论】:

  • if line == <=20??
  • 我不明白......也许我的代码完全不正确,但基本上我想要做的是创建 20 个不同的列表,按空间分隔,我可以参考。每一行都应该有一个新列表,其变量名称为 line(line number),其内容由该行组成,以空格分隔。
  • 你可以看看这个问题 - stackoverflow.com/questions/5036700/…

标签: python list loops


【解决方案1】:

为什么不使用 dict 并更新脚本的本地变量?

with open('ProjectEuler11Data.txt') as numbers:
    data = numbers.readlines()
    d = {}
    for i,line in enumerate(data):
        d["line"+str(i)] = line.split()
locals().update(d)

这样您将在脚本范围内获得lineX。 为了解释: 在python中,一切(几乎)都是一个对象,每个对象都有一个带有定义它的变量的字典,一个类的字典中将有self属性,以及例如函数。即使模块或脚本的变量存储在字典中,您也可以通过globals() 访问该字典以获取外部范围可以访问的全局变量,或者通过locals() 访问内部范围中的变量。由于它存储在字典中,因此您可以像管理它一样管理它,调用任何其他字典对象可用的任何方法。所以,例如:

locals()["myVariable"] = 5

正在创建一个变量myVariable,它在模块范围内存储一个5

【讨论】:

  • 你能解释一下更新本地人的意思吗?抱歉,我对 Python 还很陌生,而且我以前从未使用过 dict。因此,如果我改用 dict ,这些值会被拆分吗?现在我有一个 20 x 20 的数字网格需要分类。
  • @KyleWescott,用简要说明和简单示例更新了我的答案,还添加了分割线,并修复了本地调用
【解决方案2】:

您可以使用globals()locals() 来定义作用域 指针名称。 enumerate() 内置函数还允许您遍历集合的索引和值。了解这一点后,您可以执行以下操作:

with open('ProjectEuler11Data.txt') as numbers:
    data = numbers.readlines()
    for i, line in enumerate(data):
        globals()['line%d' % i] = line.split()

【讨论】:

    【解决方案3】:
    with open('ProjectEuler11Data.txt') as numbers:
        data = numbers.readlines()
    lines = [line.split() for line in data]
    

    当您可以拥有一个包含所有行的数组时,我不确定为什么每行都需要不同的变量名。 您现在可以通过 line[0]、line[1] 等简单地访问各个行。

    【讨论】:

    • 这似乎与我试图做的差不多,但是我如何访问行中的各个数字?就像我试图访问第 [6] 行中的第五个数字一样。另外,我认为 Python 没有数组?那个例子中的线条是什么结构?
    • 当然 Python 有数组。您可以通过例如获取一行中的各个条目line[2][1],这将是第 2 行中的第 1 个条目(从零开始,因此实际上是第三行中的第二个条目......)
    • @KyleWescott 它们被称为列表参考docs
    【解决方案4】:

    我假设您想从文件中读取前 20 行 - 试试看,-它只是 3 行将此扩展为 20 行

    f  = open(r"C:\New Text Document.txt",'rb')
    lst =[]
    for i in f.readlines()[0:2]:
        print i
        lst.append(i.split())
    
    print lst
    

    输出:

    [['1efu', 'ieo', 'ioew'], ['2ku', 'fa', 'foa']]
    

    如果你想要扁平化的列表-

    lst.append(','.join(i.split()))
    

    输出-

    ['1efu,ieo,ioew', '2ku,fa,foa']
    

    编辑- 要将行引用到内容中,请使用Dictionary

    f  = open(r"C:\New Text Document.txt",'rb')
    dic = {}
    
    count = 1
    for i in f.readlines()[0:2]:
        print i
        global count
        dic.update({'line%s'%count:i.split()})
        count+=1
    print dic
    

    输出-

    {'line2': ['2ku', 'fa', 'foa'], 'line1': ['1efu', 'ieo', 'ioew']}
    

    【讨论】:

    • 如何在列表中引用单个对象? (我认为这就是您的解决方案所说的)
    猜你喜欢
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2019-06-19
    • 1970-01-01
    相关资源
    最近更新 更多