我目前有一个存储在变量中的列表,例如:
我有一个变量z来保存这些信息。
我想将每3行连接在一起,因此输出为日期+时间+一行中的顺序。我尝试了以下但是每行放3个字母而不是3行
threelines = range(0,len(z),3)
for num, line in enumerate(z):
if num in threelines:
print ' '.join(z[num:num+3])
任何帮助将不胜感激!
答案 0 :(得分:3)
您不需要使用索引,您可以编写非常明确的代码,如:
lines_iter = iter(z.splitlines()) # If z is a file, lines_iter = z works
# itertools.izip() is usable, too, for a low memory footprint:
for date_time_order in zip(lines_iter, lines_iter, lines_iter):
print " ".join(date_time_order) # "<date> <time> <order>"
这样做的好处是可以为您提供非常清晰的变量名称,即使z
是迭代器(如文件)也可以工作:没有必要事先知道行数,这个方法使用很少的内存。
它的工作方式来自zip()
的工作原理:it builds tuples of elements, by getting the next element of each of its arguments in turn。因此,它首先返回lines_iter
等的第一,第二和第三个元素。
答案 1 :(得分:0)
我不知道你从哪里得到z,但从你的描述看起来像这样:
# define z ......
z = ['date1', 'time1', 'Order1','date2', 'time2', 'Order2','date3', 'time3', 'Order3','date4', 'time4', 'Order4',]
# if z is a string with newlines (you mentioned lines...)
string_with_newlines ="date1\ntime1\nOrder1\ndate2\ntime2\nOrder2"
z = string_with_newlines.splitlines()
# z becomes ['date1', 'time1', 'Order1','date2', 'time2', 'Order2'] and that is a real list^
# make new list
l = []
# iterate over 3 items in z
for n in range(len(z)//3):
# join the 3 item from z for this iteration and put them into the new list
l.append(' '.join(z[n*3:n*3+3]))
print l
# print output
['date1 time1 Order1',
'date2 time2 Order2',
'date3 time3 Order3',
'date4 time4 Order4']
答案 2 :(得分:0)
您的代码已经有效,但前提是z
是字符串列表,而不是单个字符串。
原件:
z = """Hello,
how
are
you?
I
am
fine.
Lovely
Weather."""
threelines = range(0,len(z),3)
for num, line in enumerate(z):
if num in threelines:
print ' '.join(z[num:num+3])
结果:
H e l
l o ,
h o
...
改为使用列表:
z = """Hello,
how
are
you?
I
am
fine.
Lovely
Weather."""
z = z.split("\n")
threelines = range(0,len(z),3)
for num, line in enumerate(z):
if num in threelines:
print ' '.join(z[num:num+3])
结果:
Hello, how are
you? I am
fine. Lovely Weather.
顺便提一下,对于大型输入,您的num in threelines
检查效率有点低。我建议使用this帖子中的分块配方。
z = """Hello,
how
are
you?
I
am
fine.
Lovely
Weather."""
z = z.split("\n")
def chunks(l, n):
""" Yield successive n-sized chunks from l.
"""
for i in xrange(0, len(l), n):
yield l[i:i+n]
for chunk in chunks(z, 3):
print " ".join(chunk)
答案 3 :(得分:0)
实际上,如果z
是一个字符串列表,如
z = ['first line', 'second line', 'third line', ...]
您的代码应该有效。 (如果它不是,但它是一个简单的字符串,你可以使用z.splitlines()
或z.split()
如果它们被空格分隔,就可以使它成为行列表。
但是它特别浪费:你生成一个列表,其中所有索引都是3的倍数,然后枚举列表的元素,如果索引是索引列表中的多个3(每次迭代都会检查一次) !),打印当前元素和后面的两个元素。
您可以直接生成3个连续元素的块,而无需使用for循环内的条件。您可以在此处找到多个解决方案:How do you split a list into evenly sized chunks?
一个简单的问题是:
z[i:i+3] for i in xrange(0, len(z), 3)