2012-06-16 56 views
7

Tôi là người mới lập trình và tôi đang cố gắng thực hiện các sự cố codingbat.com để bắt đầu. Tôi gặp vấn đề này:Bỏ qua các phần tử trong Danh sách Python

Cho một mảng tính tổng trừ khi có 13 trong mảng. Nếu có 13 trong mảng, bỏ qua số 13 và số ngay sau đó. Ví dụ [1,2,13,5,1] sẽ mang lại 4 (kể từ khi 13 và 5 được bỏ qua).

Đây là những gì tôi có cho đến nay. Vấn đề của tôi là tôi không biết phải làm gì khi có nhiều 13 giây ... Và tôi muốn học mã hóa hiệu quả. Các bạn có thể giúp không? (Tôi đang sử dụng python 3.2) Cảm ơn!

def pos(nums): 
    for i in nums: 
     if i == 13: 
      return nums.index(13) 
    return False 

def sum13(lis): 
    if pos(lis)!= False: 
     return sum(lis[:pos(lis)])+sum(lis[pos(lis)+1:]) 
    else: 
     return sum(lis) 
+1

Ví dụ của bạn nên thực sự mang lại '4', đúng không? 1 + 2 + 1 = 4. – cheeken

+0

@cheeken Tôi đã đổi thành 4 – jamylak

+0

@everybody đua để đăng các giải pháp: vui lòng nhận ra rằng [1,2,13,5,13,13, -9,13,13,13,13 , 13,1,1] nên mang lại 4 là tốt ... – Will

Trả lời

6

Một điều khó khăn để nhận thấy là một cái gì đó như thế này: [1, 13, 13, 2, 3]

Bạn cần phải bỏ qua 2 quá

def getSum(l): 
    sum = 0 
    skip = False 
    for i in l: 
     if i == 13: 
      skip = True 
      continue 
     if skip: 
      skip = False 
      continue 
     sum += i 
    return sum 

Giải thích:

Bạn đi qua các mục trong danh sách từng người một

Mỗi khi bạn

  • Đầu tiên kiểm tra nếu nó 13, nếu có, sau đó bạn đánh dấu skip như True, do đó bạn cũng có thể bỏ qua mục tiếp theo.
  • Thứ hai, bạn kiểm tra xem skipTrue, nếu có, nghĩa là đó là mặt hàng ngay sau 13, vì vậy bạn cũng cần phải bỏ qua mục này và bạn cũng cần đặt skip quay lại False để bạn không bỏ qua mục tiếp theo.
  • Cuối cùng, nếu nó không phải là một trong hai trường hợp trên, bạn thêm giá trị lên đến sum
+0

Bạn có thể giải thích sự lặp lại này cho một newb như tôi không? –

+0

@Chowza xem các cập nhật của tôi ở trên – xvatar

+0

Ah, tôi đã không nhận ra nếu bỏ qua: ngụ ý nếu bỏ qua = True ... Cảm ơn! –

1

Sử dụng vòng lặp while để đi qua danh sách, tăng i theo cách thủ công. Trên mỗi lần lặp lại, nếu bạn gặp phải 13, tăng i hai lần; nếu không, hãy thêm giá trị vào tổng đang chạy và tăng i một lần.

def skip13s(l): 
    i = 0 
    s = 0 
    while (i < len(l)): 
     if l[i] == 13: 
      i += 1 
     else: 
      s += l[i] 
     i += 1 
    return s 
0

Bạn có thể sử dụng vòng lặp while để xử lý nhiều 13.

def sum13(lis): 
    while pos(lis): 
     if pos(lis) == len(lis) - 1: 
      lis = lis[:pos(lis)] 
     else: 
      lis = lis[:pos(lis)]+lis[pos(lis)+1:] 

    return sum(lis) 
+0

Vì một số lý do, điều này không hiệu quả đối với [13,1,2,13,2,1 , 13] ... Nó đã cho 45 là số tiền –

+0

Tôi nghĩ rằng đó là bởi vì các yếu tố mới nhất trong danh sách là 13.So tôi chỉnh sửa mã của tôi. – plucury

3

Bạn có thể sử dụng chức năng zip để lặp các giá trị trong cặp:

def special_sum(numbers): 
    s = 0 
    for (prev, current) in zip([None] + numbers[:-1], numbers): 
     if prev != 13 and current != 13: 
      s += current 
    return s 

hoặc bạn có thể làm một oneliner:

def special_sum(numbers): 
    return sum(current for (prev, current) in zip([None] + numbers[:-1], numbers) 
       if prev != 13 and current != 13) 

Bạn cũng có thể sử dụng vòng lặp:

from itertools import izip, chain 
def special_sum(numbers): 
    return sum(current for (prev, current) in izip(chain([None], numbers), numbers) 
       if prev != 13 and current != 13) 

(danh sách đầu tiên trong izip dài hơn thứ hai, zipizip bỏ qua các giá trị thêm).

+0

Xin cảm ơn! Điều này có vẻ như nó sẽ làm việc và sau một thời gian dài, bây giờ tôi hiểu nó. Cảm ơn! –

+0

Mã này rất thiếu bộ nhớ, và sẽ không hoạt động với các trình vòng lặp :) – astynax

+0

Nó hoạt động với các trình vòng lặp quá! – Oren

1

Tôi nghĩ rằng đây là giải pháp nhỏ gọn nhất:

def triskaidekaphobicSum(sequence): 
    return sum(sequence[i] for i in range(len(sequence)) 
       if sequence[i] != 13 and (i == 0 or sequence[i-1] != 13)) 

này sử dụng hàm sum dựng sẵn() trên một biểu thức máy phát điện. Máy phát sinh tạo ra tất cả các phần tử trong chuỗi miễn là chúng không phải là 13, hoặc ngay sau 13. Điều kiện "hoặc" phụ là xử lý mục đầu tiên trong chuỗi (không có mục trước đó).

1

Một số FP-style :)

def add_but_skip_13_and_next(acc, x): 
    prev, sum_ = acc 
    if prev != 13 and x != 13: 
     sum_ += x 
    return x, sum_ 

filter_and_sum = lambda l: reduce(add_but_skip_13_and_next, l, (0,0))[1] 

>>> print filter_and_sum([13,13,1,4]) 
4 
>>> print filter_and_sum([1,2,13,5,13,13,-9,13,13,13,13,13,1,1]) 
4 

Mã này làm việc cho bất kỳ iterator, thậm chí nó không cung cấp truy cập ngẫu nhiên (indexing trực tiếp) - ổ cắm ví dụ :)

oneliner :)

>>> filter_and_sum = lambda l: reduce(
...  lambda acc, x: (x, acc[1] + (x if x != 13 and acc[0] != 13 else 0)), 
...  l, (0,0))[1] 
>>> print filter_and_sum([1,2,13,5,13,13,-9,13,13,13,13,13,1,1]) 
4 
0
def skipAndAddFun(inputVal, skipList): 
    sum = 0 
    for i in inputVal: 
     if not i in skipList: 
      sum += i 
    return sum 

Cách sử dụng:

skipAndAddFun([1,2,13,5,1], [13, 5]) 
4 

Chức năng đơn giản này sẽ là giải pháp chung cho câu hỏi của bạn.

Các vấn đề liên quan