2009-10-07 20 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))