2009-10-07 51 views
0
author_A = [['book_x',1,10],['book_y',2,20],['book_z',3,30]] 
author_B = [['book_s',5,10],['book_t',2,20],['book_z',3,30]] 

author_A AND author_B = ['book_z',3,30] 
      author_A = [['book_x',1,10],['book_y',2,20]] 
      author_B = [['book_s',5,10],['book_t',2,20]] 
      --------------------------------------------- 

我想目前的数据是这样帮助解决我的问题与Python LIST?

 author  quantity Amount($) 
     A&B  3   30 
     A   3   30 
     B   7   30 
     total  13   90 

我不想这样目前的数据!在这种情况下,它重复的新增[“book_z”,3,30]

  author quantity Amount($) 
      A   6   60 
      B   10   60 
      total  16   120 

这是我的问题,任何人请帮我SOVE这个问题。 谢谢大家

+1

你可以展示一些实际的Python源代码来证明你到目前为止有什么? – 2009-10-07 03:36:36

回答

6
author_A = [['book_x',1,10],['book_y',2,20],['book_z',3,30]] 
author_B = [['book_s',5,10],['book_t',2,20],['book_z',3,30]] 

def present(A, B): 
    Aset = set(tuple(x) for x in A) 
    Bset = set(tuple(x) for x in B) 
    both = Aset & Bset 
    justA = Aset - both 
    justB = Bset - both 
    totals = [0, 0] 
    print "%-12s %-12s %12s" % ('author', 'quantity', 'Amount($)') 
    for subset, name in zip((both, justA, justB), ('A*B', 'A', 'B')): 
    tq = sum(x[1] for x in subset) 
    ta = sum(x[2] for x in subset) 
    totals[0] += tq 
    totals[1] += ta 
    print ' %-11s %-11d %-11d' % (name, tq, ta) 
    print ' %-11s %-11d %-11d' % ('total', totals[0], totals[1]) 

present(author_A, author_B) 

我试图重现你想要的奇怪格式与一些n成员左对齐和完全时髦的间距,但我相信你需要调整各种打印语句的格式,以获得您的示例的确切(和完全奇怪)格式化效果。但是,除了输出的间距和左右对齐之外,这应该正是您所要求的。

+0

Thanks.Alex Martelli。 (A,B,C,D) 现在我想灵活使用现在(列表)的作者)。 感谢您的帮助! – kn3l 2009-10-07 04:40:24

+0

@python(尼克尼克! - ),计算作者的整个权力是很难,而很可能尤其是。与itertools.combinations - 但为什么不打开一个单独的问题(理想的省略格式怪癖;-),因为它是非常不同的这个问题,即如果你想“所有作者”,“除一个之外”,“所有但两个“,......”只有一个作者,没有其他人“,这是一个”powerset“,并且在计算和正确处理时具有特定的细节(跳过空组合等等)。我会建议接受这个答案并打开另一个(没有格式;-)。 – 2009-10-07 05:02:15

1

你可以找到交叉点和专属的像这样...

A_and_B = [a for a in author_A if a in author_B] 
only_A = [a for a in author_A if a not in author_B] 
only_B = [b for b in author_B if b not in author_A] 

那么它只能是印制的事......

print '%s %d %d' % tuple(A_and_B) 
print '%s %d %d' % tuple(only_A) 
print '%s %d %d' % tuple(only_B) 

希望帮助

+1

Upvote很谨慎 - 不知道我理解这个问题,但AFAICT这是一个很好的答案。迂腐的批评 - 总失踪。 – Steve314 2009-10-07 03:48:56

+0

我希望他调整这个以获得自己需要的脚本..因为我看到他正在学习python,所以我不想给一个完整的脚本来完成他所需要的,甚至不需要阅读代码:)。但是,亚历克斯的解决方案很酷。我必须习惯使用套:D ..感谢您的投票btw – 2009-10-07 03:54:06

+0

我同意亚历克斯的答案,公司。他使用套装非常出色 - 但我仍然认为使用三种理解并且没有一组交叉/差异具有轻微的可读性边缘。尽管如此,对于大型数据集可能效率不高。 – Steve314 2009-10-07 04:48:30

0
books = { 
    'A':[['book_x',1,10],['book_y',2,20]], 
    'B':[['book_s',5,10],['book_t',2,20]], 
    'A & B':[['book_z',3,30]], 
} 
for key in books: 
    quantity = [] 
    amount = [] 
    for item in books[key]: 
     quantity.append(item[1]) 
     amount.append(item[2]) 
    print ("%s\t%s\t%s") % (key,sum(quantity),sum(amount))