并排打印未知大小的列表

0 投票
2 回答
3802 浏览
提问于 2025-04-17 13:40

我有多个配对列表,存储在名为“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]))

请注意,我不知道这是否是你想要的确切格式,但你应该能根据自己的需要进行调整。

撰写回答