【问题标题】:Turning a list into a list of lists Python 3将列表转换为列表列表 Python 3
【发布时间】:2016-07-05 06:43:24
【问题描述】:

我有一个由汽车详细信息组成的列表文件。

例如

1000001 Volvo v8
1000002 Mazda 2.0

【问题讨论】:

  • 你能告诉我们这些“各种拆分列表的方法”吗?或至少其中之一。
  • while count2
  • @bobbyzamora - 如果您决定有人回答您的问题,请不要忘记“接受”答案

标签: python list python-3.x text text-files


【解决方案1】:

听起来你需要split 每一行;您可以使用列表推导,如下所示

cars = [line.split() for line in open("Cars.txt")]

如 cmets 中所述;你想要数字的数字表示。为此,您需要将数字列转换为数字。例如。

for i in range(len(cars)):
    cars[i][0] = int(cars[i][0])
    cars[i][-1] = int(cars[i][-1])

然后例如cars[0][0] 将是一个数字。 或者,如果数字始终为正整数,您可以将其压缩为:

readline = lambda l: [int(n) if n.isdigit() else n for n in l.split()]
cars = [[ readline(line) for line in open("Cars.txt")]

对于任何更复杂的数据文件读取,您可能想要使用例如pandas

发电机

正如 zondo 在 cmets 中指出的那样,您可以考虑使用 generator 代替,它不会将所有数据加载到内存中(而是在请求时“生成”每个元素);这可以通过在理解中将[] 替换为() 来完成:

cars = (line.split() for line in open("Cars.txt"))

然后您仍然可以像遍历列表一样遍历汽车,但您不能像列表一样将索引编入生成器。

【讨论】:

  • 请注意,您可能希望使用() 而不是[] 来节省内存。当然,这不一定适用于所有情况,但它可能是有利的。
  • @zondo:在这种情况下,OP 暗示他们最后想要一个列表(不是生成器)——但总的来说是一个很好的评论。
  • 我知道他确实说过,但他可能不知道发电机,所以不知道它们可以更有效。
  • 这是我用过的一种方法。如果我返回第一个项目,即汽车 [0],它返回 1000001 沃尔沃 34000,我现在需要能够访问 34000 并将其乘以一个数字并存储/输出该数字
  • 索引-1用于访问列表、元组等的末尾
【解决方案2】:

如果您想以正确的方式访问文本文件中的所有信息,您可以简单地为它定义一个类。然后用文件中的信息填充它。这是一个示例实现。我在这里使用了unpack operator (*)。

class Car(object):

    def __init__(self, id, name, price):
        self.id = id
        self.name = name
        self.price = price

    def __str__(self):
        return self.id + ' ' + self.name + ' ' + self.price


file = open("file.txt", 'r')
cars = [Car(*line.split()) for line in file]

for c in cars:
    print c

如果你有一个非常大的文件,或者使用生成器表达式

cars = (Car(*line.split()) for line in file)

在这两种情况下都会打印,

1000001 Volvo 34000
1000002 Mazda 23000

【讨论】:

    【解决方案3】:

    这里是纯python方式:

    text = '1000001 Volvo 34000 1000002 Mazda 23000'
    
    # Split text into one list
    l = text.split()
    
    # Split list into list of list every 3rd element
    l = [l[i:i+3] for i in range(0, len(l), 3)]
    print l
    

    [['1000001', 'Volvo', '34000'], ['1000002', 'Mazda', '23000']]
    

    【讨论】:

    • 仅供参考,原本文字都在一行上...如果问题更新后不是这种情况,那么这个答案并不正确...
    【解决方案4】:

    这可以通过regex 来完成,以产生tuples 的list

    import re
    
    text = '1000001 Volvo 34000 1000002 Mazda 23000'
    
    l = re.findall(r'(\d+) (\w+) (\d+)', text)
    print l
    

    [('1000001', 'Volvo', '34000'), ('1000002', 'Mazda', '23000')]
    

    如果你真的需要lists 中的list,你可以转换它:

    l = [list(x) for x in l]
    print l
    

    [['1000001', 'Volvo', '34000'], ['1000002', 'Mazda', '23000']]
    

    【讨论】:

    • 为什么使用正则表达式而不是简单的拆分?既然.split() 是内置在 Python 语言中的,我们就不能假设它使用了最有效的方法吗?
    • 嗯,这是一种方法......你是对的 regex 通常是性能下降......请参阅我的新 answer 以了解纯 Python 方法。跨度>
    • 正则表达式是一种高级技术。这个 OP 在 python 上显然不是很先进,所以我投了反对票。
    • 为什么不呢?他要求的是可以简单地完成的事情。为什么要引入性能更差的更高级方法?
    • 我发现这一切都非常有用,谢谢,但此时最简单的方法总是最好的,感谢大家,我进步很大。
    【解决方案5】:

    这是您可以使用split 函数将结果存储在list 中的方法:

    cars = []
    
    with open("cars.txt", 'r') as f:
        for line in f:
            cars.append(line.split())
    

    如果您希望能够根据您的唯一 ID 快速搜索,最好使用字典。

    【讨论】:

    • 这是我用过的方法,很好,但我需要能够实际计算每辆车的成本并将其乘以一个数字。那是我的主要斗争,我似乎无法真正掌握那个价值。
    猜你喜欢
    • 1970-01-01
    • 2018-10-25
    • 2018-01-17
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多