2015-06-21 106 views
2

這兩個元的部分的值是一個簡單的代碼,我有:比較在python

a=(6,3,4,5) 
b=(1,2,1,3) 

if (a[i]<b[i+1] for i in range(1,3)): 
    print("Yes") 
else: 
    print("No") 

什麼,我試圖做的是 打印是如果[1] < B [2]和[ 2] < a [3],否則返回No.

此代碼始終返回是。有關如何修改這個的任何提示?

+1

您的句子「我是... a [1]」未完成? – ycsun

+0

我修好了。謝謝。 – NNsr

+1

您是不是指'a [1]

回答

4

使用allany來同時測試元組中的所有值。 all返回True如果iterable中的所有內容都是True -ish; any返回True如果可迭代中的任何內容是True -ish。

例如:

if all(a[i]<b[i+1] for i in range(1,3)): 
    print("Yes") 
else: 
    print("No") 
+0

感謝您的評論。但我不想比較所有元素。正如你所看到的,我跳過了b的第一個元素和a的最後一個元素。 – NNsr

+1

@NNsr:你可以指定一個任意的迭代 - 例如,只是你上面做的比較。 – nneonneo

1

您可以使用reduce積累的結果:

def test(a, b): 
    return "Yes" if (reduce(lambda i, j: a[i]<b[j], range(1,3))) else "No" 


a=(6,3,4,5) 
b=(1,2,1,3) 
print test(a, b) # "No" 

a=(0,0,0,0) 
print test(a, b) # "Yes" 
0

一種方法是使用zip(),這就像一個拉鍊 - 給它兩個序列,它網格它們在一起,給出每個的第一個元素,每個的第二個元素等:

>>> a=(6,3,4,5) 
>>> b=(1,2,1,3) 
>>> list(zip(a,b)) 
[(6, 1), (3, 2), (4, 1), (5, 3)] 

然後,你可以切片,與你所感興趣的那些:

>>> zip(a,b)[1:3] 
[(3, 2), (4, 1)] 

然後測試那些在一個循環:

for an, bn in zip(a, b)[1:3]: 
    if an < bn: 
     ??? 

並使用Python's for/else loop thing來處理跟蹤所有的人,而只有打印輸出一旦。一旦出錯,打印失敗,如果打印結束並且沒有錯,則打印是。

for an, bn in zip(a, b)[1:3]: 
    if an > bn: 
     print("No") 
     break 
else: 
    print("Yes") 
+0

謝謝。但是通過這種方式,你可以將一個元組的第i個元素與另一個元素的第i個元素進行比較。我有興趣將一個元素的第i個元素與另一個元素的第(i + 1)個元素進行比較。 – NNsr

+1

我更喜歡@ nneonneo的回答,我在寫我的時候沒有看到它。但在我的回答中,沒有理由需要'zip(a,b)',你可以'zip(a,b [1:])'來獲得偏移量。 – TessellatingHeckler