列表理解 - 如何在一个列表中包含字符串和整数?

时间:2015-09-04 17:48:00

标签: python list python-2.7

我为这个问题的复杂性道歉,但对我来说,对Python来说这是一个巨大的挑战:

我有一个存储文本行的外部文件:input.txt

min: 1,2,3,5,6
max: 1,2,3,5,6
avg: 1,2,3,5,6

我将这个文件的内容读入一个名为input_data的新变量中的各种列表中,如下所示:

input_data = []
with open('input.txt') as inputfile:
    for line in inputfile:
        input_data.append(line.strip().split(','))

input_data的结果如下:

[['min: 1', '2', '3', '5', '6'], ['max: 1', '2', '3', '5', '6'], ['avg: 1', '2', '3', '5', '6']]

所以我有一个变量,其中存储了3个列表。

如何在'min','max'和'avg'之后删除“:”?

我试过了:

input_data = input_data.replace(":",",")

另外,如何将minmaxavg保留为字符串,但将列表中的数字更改为整数?例如

['min', 1, 2, 3, 5, 6]  

'min'字符串和所有数字整数

3 个答案:

答案 0 :(得分:2)

只需在冒号上拆分,然后在分割逗号后将其余部分映射到int:

with open("in.txt") as f:
    for line in f:
        a, rest = line.split(":",1)
        print([a] + map(int,rest.split(",")))

输出:

['min', 1, 2, 3, 5, 6]
['max', 1, 2, 3, 5, 6]
['avg', 1, 2, 3, 5, 6]

答案 1 :(得分:1)

input_data = []
with open('input.txt') as inputfile:
    for line in inputfile:
        row = []
        sections = line.strip().split(':')  # First split out the title
        kind = sections[0]
        row.append(kind)
        data = sections[1].split(',')
        for entry in data:
            row.append(int(entry))  # Use int to convert to integer
        input_data.append(row)

试试吧。首先,我只使用冒号:拆分该行。第一部分是标题('min','max'和'avg'),我将其添加到输出数据的新“行”中。

然后我将第二部分(数字)与您完全相同。然后我使用built in function int将字符串数转换为实际的整数值。

我使代码非常明确,所以你应该能够理解每一行!

如果你真的想要列表理解,我上面代码的(非常难看的)直接翻译如下:

with open('input.txt') as f:
    result = [[line.split(':')[0]] + [int(x) for x in line.split(':')[1].split(',')] for line in f]

答案 2 :(得分:1)

首先,我建议将其分开。要保持单词和第一个值分开,请将空格转换为逗号,以便正确分割。在这种情况下,您可以将“:”转换为逗号,这样它就会自动删除冒号。

input_data = line.strip().replace(': ', ',').split(',')

然后将所有必要的值转换为整数,你可以用很多方法来做,但这里有两个例子:

input_data = [input_data[0]] + [int(i) for i in input_data[1:]]
input_data = [int(i) for i if i.isdigit() else i for i in input_data]

或者,如果你在开始时没有做到这一点并仍然有一个冒号,那么你可以通过调整上述方法之一来摆脱它:

input_data = [int(i) for i if i.isdigit() else i.replace(':', '') for i in input_data]

最后,这应该适用于您的代码:

input_data = []
with open('input.txt') as inputfile:
    for line in inputfile:
        input_data.append([int(i) for i if i.isdigit() else i for i in line.strip().split(',')])

或者如果需要,稍微缩短版本:

with open('input.txt') as inputfile:
    input_data = [[int(i) for i if i.isdigit() else i for i in line.strip().split(',')] for line in inputfile]

Symmitchry的回答可能有点好一点,但把它分成两秒并没有让我想到。