2017-08-01 5 views
1

私はPythonで2つのリンクリストから2つの数字を追加するアルゴリズムを実装しています。例えばpython ternary if文がキャッチされないなし

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

(コーディング面接2-5割れから)これは

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を使用する場合、ないternary operator

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

は私が何かを逃したの働いていますか? ありがとう!

+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がNoneいる可能性がありますので、持っていません。 data属性を使用しているため、例外が発生しています。したがってdataにアクセスする前にpointer1Noneでないことを確認する必要があります。

1

問題は、pointer.dataが「なし」かどうかを確認していることです。しかし実際にはpointerです。これはNoneになります。したがって、コードが3値化された場合、最初にNoneオブジェクトからdataという属性を取得しようとします。

あなたはそれがpointerがNoneかどうかをチェックしますようにコードを変更する必要があります:first = 0 if pointer1 is None else pointer1.data

関連する問題