-1

我需要编写一个具有名称列表的程序,并且在每组名称(在 2 行中)下面是 2 组逗号(1,2)

所以像这样

Jane
Doe
14.5,12.3

用相同的 3 行重复,直到循环到达 0,0,这就是终止循环的原因。

我如何准确地编写一个同时输入的循环,以及如何在字符串和数字之间分开。

4

3 回答 3

1

如果项目分为三行,我会使用:

data = []
with open('inputfile.txt') as inf:
    numbers = None
    while numbers != [0, 0]:
        name1 = next(inf).strip()
        name2 = next(inf).strip()
        numbers = [float(n) for n in next(inf).split(',')]
        data.append((name1, name2, numbers))

这将输入文件用作可迭代的,一次获取 3 行,直到numbers等于[0, 0].

于 2013-03-17T18:03:02.497 回答
0

可能有意义的第一步是将您的列表缩减为您需要的名称和数字。你可以很容易地做到这一点,因为你只对第一行之前的 '0,0' 列表部分感兴趣:你可以只取该行的索引并在那里切片列表以获得该部分:

your_data = ['Jane', 'Doe', '14.5,12.3', etc etc]
z_index = your_data.index('0,0')
new_data = your_data[:z_index + 1] # +1 to include '0,0' as the last element

从那里开始,这取决于您想要对数据实际执行的操作。但是,假设您想要一个包含名称和数字的字典列表:

results = []
while new_data:
    results.append({'first':new_data[0],
                    'last':new_data[1],
                    'numbers':new_data[2]})
    new_data = new_data[3:]

数字对在这里仍然是字符串,因为它是从您的 txt 文件中读取的。如果需要,您可以在将数字分配给字典时拆分数字并将它们转换为浮点数。

另外,我在这里做了一些假设:您的列表将始终包含“0,0”行,并且不可能丢失任何第一/最后/数字行。如果情况并非总是如此,您将需要一些逻辑来处理异常。

于 2013-03-17T18:45:17.867 回答
0

我对它的使用takewhile和一个自定义函数使用ast.literal_eval,以及来自的grouper配方itertools,然后再将其转置一点,例如:

from itertools import takewhile, izip_longest
from ast import literal_eval

def until_0(text):
    try:
        return literal_eval(text) != (0, 0)
    except ValueError:
        return True

with open('/home/jon/data.txt') as fin:
    lines = (line.rstrip() for line in fin)
    data = list(takewhile(until_0, lines))

def grouper(n, iterable, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

print [list(el) for el in grouper(3, data, fillvalue='0,0')]
# [['Jane', 'Doe', '14.5,12.3'], ['Jane', 'Doe', '6.7,2.3'], ['John', 'Doe', '0,0']]
于 2013-03-17T19:16:53.713 回答