并排打印未知大小的列表
我有多个配对列表,存储在名为“dates”和“prices”的字典里。这个列表的大小不确定,但我想把它们并排打印出来,像这样:
date_value1 price_value1 date_value2 price_value 2
不过现在,我只能让它们一个接一个地打印出来,像这样:
for i in range(len(cities)):
for j,k in zip(dates[i],prices[i]):
print str(i) + " ; " + j.text +" ; "+ k.text
我尝试过用以下方法来实现我想要的效果:
a = {}
for i in range(len(cities)):
for j,k in zip(dates[i],prices[i]):
print str(i) + " ; " + j.text +" ; "+ k.text
try: a[i] = a[i-1] + " ; " + j.text +" ; "+ k.text
except: a[i] = " ; " + j.text +" ; "+ k.text
for i in a[len(cities)-1]:
print a
但是结果却完全不同,我真的搞不明白为什么会这样。
你能帮我吗?谢谢。
这是我修复代码的方法。谢谢你,F.J
a = 100000
for i in xrange(len(citynames)):
if len(precos[i]) < a: a = len(precos[i])
print citynames[i], " ; "," ; ",
print
for j in xrange(a):
for i in xrange(len(citynames)):
print datas[i][j].text, " ; " ,precos[i][j].text, " ; ",
print
2 个回答
1
另一个答案是可行的,但如果我在代码审查中看到这个,我会留下这样的评论:
先格式化数据,然后再展示。
先创建一个你想要的格式的行列表。然后再打印这些行。这个方法更容易测试,阅读起来也更清晰,而且各部分之间的关系更松散。
def append_to_rows(city, dates, prices, row):
for date, price in zip(dates, prices):
row.append(' ; '.join([city, date.text, price.text]))
def print_rows(rows):
for row in rows:
print row
def print_data(cities, prices, dates):
rows = []
for city in cities:
append_to_rows(city, dates[city], prices[city], rows)
print_rows(rows)
测试:
class Text(object):
def __init__(self, text):
self.text = text
cities = ['new york', 'san francisco', 'los angeles']
dates = {
'new york': [
Text('2008'),
Text('2009'),
],
'san francisco': [
Text('2008'),
],
'los angeles': [
Text('2008'),
Text('2009'),
Text('2010'),
],
}
prices = {
'new york': [
Text('$500'),
Text('$600'),
],
'san francisco': [
Text('$400'),
],
'los angeles': [
Text('$300'),
Text('$400'),
Text('$500'),
],
}
>>> print_data(cities, dates, prices)
new york ; 2008 ; $500
new york ; 2009 ; $600
san francisco ; 2008 ; $400
los angeles ; 2008 ; $300
los angeles ; 2009 ; $400
los angeles ; 2010 ; $500
2
我觉得你这里缺少的关键点是,如何在打印的时候不自动换行。只需要在打印的末尾加一个,
,比如:
for i in range(len(cities)):
for j,k in zip(dates[i],prices[i]):
print str(i) + " ; " + j.text +" ; "+ k.text,
print
在内层for
循环中的每个print
语句都会在输出中加一个空格,而不是换行。内层for
循环后面的print
语句是为了打印一个换行符,这样在下一次循环时就能从新的一行开始(我不确定你是否想要这样)。
不过,更好的方法是考虑使用str.join()
来构建你想要打印的整个字符串。例如:
for i in range(len(cities)):
print ' '.join(str(i)+" ; "+j.text+" ; "+k.text for j, k in zip(dates[i], prices[i]))
请注意,我不知道这是否是你想要的确切格式,但你应该能根据自己的需要进行调整。