Python 将每3行连接在一起

Python 将每3行连接在一起,python,python-2.7,Python,Python 2.7,我目前有一个存储在变量中的列表,例如: 2015年1月1日 13:22 牛排 2015年2月1日 13:23 炸薯条 2015年3月1日 13:23 色拉 我有一个变量z来保存这个信息 我想把每3行连接在一起,这样输出是一行中的日期+时间+顺序。我尝试了下面的方法,但这会在每行上放置3个字母,而不是3行 threelines = range(0,len(z),3) for num, line in enumerate(z): if num in threelines:

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

  • 2015年1月1日
  • 13:22
  • 牛排
  • 2015年2月1日
  • 13:23
  • 炸薯条
  • 2015年3月1日
  • 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])

任何帮助都将不胜感激

我不知道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']

您的代码已经可以工作了,但前提是
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
...
Hello, how are
you? I am
fine. Lovely Weather.
改为使用列表:

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])
结果:

H e l
l o ,

 h o
...
Hello, how are
you? I am
fine. Lovely Weather.

顺便说一句,您的三行
num
检查对于大输入来说效率有点低。我建议改用post中的分块方法

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)

实际上,如果
z
是一个字符串列表,如

z = ['first line', 'second line', 'third line', ...]
你的代码应该可以工作。(如果不是但它是一个简单的字符串,您可以使用
z.splitlines()
z.split()
将其作为行列表,如果它们用空格分隔)

但这尤其浪费:您生成一个包含所有3倍索引的列表,然后枚举列表中的元素,如果索引在索引列表中是3倍的(每次迭代时都要执行一次检查!),则打印当前元素及其后的两个元素

您可以直接生成3个连续元素的块,而无需在for循环中使用条件。您可以在此处找到多种解决方案:

一个简单的例子是:

z[i:i+3] for i in xrange(0, len(z), 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>"
lines\u iter=iter(z.splitlines())#如果z是一个文件,那么lines\u iter=z可以工作
#itertools.izip()也可用于低内存占用:
对于zip格式的日期、时间顺序(行、行、行):
打印“”。加入(日期、时间、顺序)
这样做的好处是可以给您提供非常清晰的变量名,并且即使
z
是迭代器(类似于文件),也可以正常工作:不需要预先知道行数,而且这种方法使用的内存很少


它的工作方式来自于
zip()
如何工作的细节:。因此,它首先返回
行的第一、第二和第三个元素,等等。

什么是
z
?…如果您将一些实际输入(例如,z的前9个值?)和预期输出(例如,具有所需格式的三行)包含到问题中,这会有所帮助。您是否在寻找?@BhargavRao:从症状中,我认为
z
是一个字符串。但如果SB77能够证实这一点,最好是在问题中添加一些示例数据,那就好了。否则,这个问题就有被关闭的严重危险。@SB77:您的更新没有澄清
z
的确切形式。我的猜测是,您的数据是在一个字符串中,单个项目由换行符分隔,或者可能由逗号或其他分隔符分隔。或者它可以在Python字符串列表中,但如果是这样的话,您当前的代码将执行您想要的操作(尽管是以一种非常奇怪的方式),如下面的答案所示。因此,为了澄清这个问题,您应该添加代码,向我们展示
z
的真实外观,类似于所有答案的处理方式。我怀疑
z
是否是字符串列表。如果是的话,OP的原始代码就已经可以工作了。@Kevin mhh。将添加拆分线;-)