2017-08-01 55 views
1

我正在實現從python中的兩個鏈表中添加兩個數字的算法。 (開裂編碼採訪2-5)python ternary如果語句不捕獲無

例如,

first: 7 -> 1 -> 6  617 
second: 5 -> 9 -> 2 +295 
         ----- 
         912 
output: 2 -> 1 -> 9 (which indicates 912) 

這是我的代碼,

class Node: 
    def __init__(self, val=None): 
     self.data = val 
     self.Next = None 

class LinkedList: 
    def __init__(self): 
     self.head = None 
     self.size = 0 

    def __repr__(self): 
     temp = self.head 
     alist = [] 
     while temp: 
      alist.append(temp.data) 
      temp = temp.Next 
     return str(alist) 

    def add(self, val): 
     cur = self.head 
     prev = None 
     if cur is None: 
      self.head = Node(val) 
     else: 
      while cur: 
       prev = cur 
       cur = cur.Next 
      prev.Next = Node(val) 
     self.size += 1 

def adding(p1,p2): 
    pointer1 = p1.head 
    pointer2 = p2.head 
    remainder = 0 
    sum_list = LinkedList() 

    while pointer1 is not None or pointer2 is not None: 
     first = 0 if pointer1.data is None else pointer1.data 
     second = 0 if pointer2.data is None else pointer2.data 
     sum_ = first + second + remainder 

     remainder = 1 if sum_ >= 10 else 0 

     sum_ %= 10 

     sum_list.add(sum_) 

     if pointer1 is not None: 
      pointer1 = pointer1.Next 
     if pointer2 is not None: 
      pointer2 = pointer2.Next 
    if remainder > 0: 
     sum_list.add(remainder) 
    return sum_list 

我的問題是first = 0 if pointer1.data is None else pointer1.data。 當兩個鏈表的大小相同時,它正在工作,但是,如果一個比另一個短,則較短的一個變爲None。因此,我期望我的if語句能夠捕捉到這一點,並將變量(第一個)作爲0。但它會拋出AttributeError: NoneType object has no attribute 'data'

它工作,如果我寫的一般,沒有ternary operator

if pointer1 is None: 
    first = 0 
else: 
    first = pointer1.data 
if pointer2 is None: 
    second = 0 
else: 
    second = pointer2.data 

我錯過了什麼,當我使用ternary operator? 謝謝!

+1

是的,因爲在執行'pointer1.data'之前你必須檢查'pointer1不是None' –

回答

2

是的,你實際上並沒有做什麼if/else語句與三元運營商做。

此:

if pointer1 is None: 
    first = 0 
else: 
    first = pointer1.data 
if pointer2 is None: 
    second = 0 
else: 
    second = pointer2.data 

將是以下幾點:

first = 0 if pointer1 is None else pointer1.data 
second = 0 if pointer2 is None else pointer2.data 

在您的版本:

first = 0 if pointer1.data is None else pointer1.data 

這有可能是pointer1是沒有的,因此沒有一個data屬性,這就是爲什麼你會得到例外。因此,在訪問data之前,您需要檢查pointer1是不是None

1

問題是你正在檢查如果pointer.data是無。但它實際上是pointer這將是None,所以當你的代碼到達三元組時,它將首先嚐試從None對象獲取屬性data

你需要改變你的代碼,以便它檢查是否pointer是無:first = 0 if pointer1 is None else pointer1.data