将每3行加入Python

时间:2015-04-29 11:33:41

标签: python python-2.7

我目前有一个存储在变量中的列表,例如:

  • 01/01/2015
  • 13时22分
  • 牛排
  • 2015年1月2日
  • 13时23
  • 弗里斯
  • 2015年1月3日
  • 13时23
  • 沙拉

我有一个变量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])

任何帮助将不胜感激!

4 个答案:

答案 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)