Danh sách tổng Python từ chỉ mục đến chỉ mục

Nếu trục là Đa chỉ số (phân cấp), hãy đếm dọc theo một mức cụ thể, thu gọn thành vô hướng

Không dùng nữa kể từ phiên bản 1. 3. 0. Từ khóa cấp độ không được dùng nữa. Sử dụng nhóm để thay thế.

numeric_only bool, mặc định Không có

Chỉ bao gồm các cột float, int, boolean. Nếu Không, sẽ cố gắng sử dụng mọi thứ, sau đó chỉ sử dụng dữ liệu số. Không được triển khai cho Sê-ri

Không dùng nữa kể từ phiên bản 1. 5. 0. Chỉ định

for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
2 không được dùng nữa. Giá trị mặc định sẽ là
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
3 trong phiên bản tương lai của pandas.

min_count int, mặc định 0

Số lượng giá trị hợp lệ cần thiết để thực hiện thao tác. Nếu có ít hơn

for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
4 giá trị không phải NA thì kết quả sẽ là NA

**kwargs

Các đối số từ khóa bổ sung được chuyển đến hàm

Trả về vô hướng hoặc Sê-ri (nếu mức được chỉ định)

Xem thêm

Trả lại tổng

Trả lại mức tối thiểu

Trả lại tối đa

Trả về chỉ số tối thiểu

Trả về chỉ số tối đa

Trả về tổng trên trục được yêu cầu

Trả lại giá trị tối thiểu trên trục được yêu cầu

Trả lại số tiền tối đa trên trục được yêu cầu

Trả về chỉ số tối thiểu trên trục được yêu cầu

Trả về chỉ số tối đa trên trục được yêu cầu

ví dụ

>>> idx = pd.MultiIndex.from_arrays([
..     ['warm', 'warm', 'cold', 'cold'],
..     ['dog', 'falcon', 'fish', 'spider']],
..     names=['blooded', 'animal'])
>>> s = pd.Series([4, 2, 0, 8], name='legs', index=idx)
>>> s
blooded  animal
warm     dog       4
         falcon    2
cold     fish      0
         spider    8
Name: legs, dtype: int64

>>> s.sum()
14

Theo mặc định, tổng của một Sê-ri trống hoặc toàn NA là

>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0
0

>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0

Điều này có thể được kiểm soát bằng tham số

for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
4. Ví dụ: nếu bạn muốn tổng của một chuỗi trống là NaN, hãy vượt qua
>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0
2

á ha. Đầu ra ví dụ của bạn cho thấy kết quả

for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
6. Sử dụng các chỉ mục dựa trên 1 (phổ biến trong một số thử thách lập trình nhất định),
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
7 có trong danh sách phụ đó các giá trị
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
8 có tổng là
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
9, gần với giá trị mục tiêu của
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
0. Tôi đang xem
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
0 và nghĩ rằng tôi đang xem một lỗi vì nó sẽ bỏ qua một danh sách phụ có tổng cộng chính xác là
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
0 vì quá lớn

"Đầu vào rất đơn giản" của bạn thực sự gây nhầm lẫn, vì sức mạnh và chỉ số của máy chủ không phải là các giá trị khác biệt. Tương tự, thứ tự được sắp xếp không đưa ra dấu hiệu rõ ràng về việc các chỉ số dựa trên 0 hay 1 được trả về

Việc thiếu các nhận xét hay, một tuyên bố vấn đề không thể truy cập và mã khó hiểu khiến cho việc xác định mục đích của mã đó là gì, điều này khiến cho việc "xem lại mã" trở thành một nhiệm vụ khó khăn và dễ mắc lỗi

Bây giờ tôi đã hiểu chuyện gì đang xảy ra, hãy làm cả hai. xem lại mã và tối ưu hóa nó


đặt tên

Các hàm và biến của bạn là sự kết hợp giữa các tên dễ hiểu (

for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
2 và
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
3) và các tên hoàn toàn mờ đục không truyền đạt bất kỳ ý nghĩa nào (
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
4 và
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
5)

Toàn cầu

Các biến toàn cầu có vị trí của chúng. Đây không phải là nó

Hàm

for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
6 không trả về gì, nhưng gọi ra
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
7 và
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
8 là các biến toàn cục mà nó sẽ đọc và ghi. Hóa ra nó cũng đang sửa đổi cả
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
9 và
>>> s.sum()
14
40

Nhiều khả năng là không, các biến

for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
7 và
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
8 không nhất thiết phải là toàn cục và có thể đơn giản là được khởi tạo bằng 0 khi bắt đầu hàm. Ngoại trừ trường hợp nếu vòng lặp bên trong các máy chủ đến cuối vòng lặp mà không vượt quá
>>> s.sum()
14
43, thì
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
8 và
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
7 sẽ không bị xóa và lệnh gọi tiếp theo tới máy chủ sẽ tiếp tục tại nơi chúng đã dừng lại. Đây có phải là cố ý?

Các tham số và biến không cần thiết

>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0
1

Điểm của

>>> s.sum()
14
46 là gì?

Hàm

for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
4 yêu cầu đối số
>>> s.sum()
14
46, nhưng bất kỳ giá trị nào được cung cấp sẽ bị bỏ qua, bị ghi đè bởi
>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0
50 trước khi sử dụng

Bên trong vòng lặp for, giá trị của

>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0
51 được lưu trữ trong
>>> s.sum()
14
46. Sau đó, cả
>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0
53 và
>>> s.sum()
14
46 đều không được sửa đổi bên trong phần thân của vòng lặp, cũng như không được sử dụng bên ngoài vòng lặp.
>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0
55 vẫn đúng miễn là cả hai biến đều nằm trong phạm vi. Điều này đặt ra câu hỏi về. tại sao lại sử dụng
>>> s.sum()
14
46 thay vì
>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0
51?

Không xác định chức năng bên trong vòng lặp

Điều này thực sự có thể dẫn đến hành vi kỳ lạ

for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")

đầu ra

>>> s.sum()
14
4

Viết để thử nghiệm

Nếu bạn đã cấu trúc mã của mình dưới dạng một chức năng giải quyết được sự cố và sử dụng trình bảo vệ chính để chạy mã khi được gửi tới trang web thử thách lập trình

>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0
5

sau đó bạn có thể viết một chương trình thử nghiệm chạy các trường hợp mẫu, chẳng hạn như

>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0
6

Có các khung kiểm tra giúp kiểm tra dễ dàng hơn. Nhìn vào pytest, unittest và doctest. Những thứ đó sẽ giúp bạn bắt đầu, nhưng có nhiều thứ khác bạn có thể thử

một phần tiền

Bất cứ khi nào bạn gặp một vấn đề mà bạn đang cộng một dãy số, bắt đầu và kết thúc tại các điểm khác nhau, bạn nên dừng lại và hỏi xem có cách nào tốt hơn không

Trong ví dụ của bạn, bạn có các số

>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0
58 và trước tiên bạn bắt đầu với
>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0
59, sau đó là
>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0
60, sau đó là
>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0
61, v.v., cho đến khi bạn có tổng số là
>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0
62 hoặc
>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0
63. Sau đó, bạn đặt lại và bắt đầu
>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0
64,
>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0
65,
>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0
66, v.v. cho đến khi bạn đạt được
>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0
67 hoặc
>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0
68. Sau đó, bạn đặt lại và bắt đầu từ
>>> pd.Series([], dtype="float64").sum()  # min_count=0 is the default
0.0
69 và tính toán
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
60,
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
61,
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
62,
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
63 hoặc
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
64. Sau đó, bạn đặt lại và bắt đầu
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
65,
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
66, ________ 567, ________ 568, ________ 569 hoặc ________ 570

Đã bao nhiêu lần bạn cộng 4 và 5 lại với nhau? . Không nhiều. Nhưng đây là một ví dụ chỉ có 10 máy chủ. Bạn có thể có một trăm nghìn máy chủ và ngưỡng sức mạnh khá cao để vượt quá. Bạn có thể thêm hàng nghìn lần một giá trị máy chủ cụ thể vào tổng số lần trước đó và vì bạn có thể có hàng nghìn giá trị máy chủ riêng lẻ, nên bạn có thuật toán \$O(N^2)\$

Thay vào đó, hãy xem xét tổng số giá trị đang chạy.

for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
71. Chúng tôi đã thêm giá trị máy chủ vào tổng số trước đó chính xác một lần. Từ danh sách đó, bạn có thể lấy tổng của bất kỳ danh sách con máy chủ nào. Chẳng hạn, tổng giá trị máy chủ từ chỉ mục 6 đến chỉ mục 8 sẽ là tổng giá trị máy chủ cho đến chỉ mục 8,
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
72, trừ đi tổng giá trị máy chủ cho đến chỉ số 5,
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
9.
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
74. Sau khi xử lý danh sách N máy chủ, thực hiện tổng cộng N phép cộng, bạn có thể lấy tổng của bất kỳ danh sách con nào với nhiều nhất một phép trừ

Điều này nghe có vẻ thú vị, nhưng điều này không thực sự cải thiện bất cứ điều gì. Sử dụng các bước tương tự ở trên, thuật toán sẽ vẫn bắt đầu bằng

for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
75,
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
76,
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
77,
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
78,
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
79,
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
80,
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
81, sau đó đặt lại thành
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
82,
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
83,
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
84,
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
85,
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
86,
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
87, sau đó đặt lại thành
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
88, tối đa là
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
89, . Thay vì thực hiện một phép cộng trên mỗi bước lặp, chúng tôi đang thực hiện một phép trừ trên mỗi bước lặp

Tại sao phải reset lại từ đầu?

Sau khi thêm các giá trị công suất của máy chủ cho đến khi bạn vượt quá yêu cầu, tại sao phải đặt lại trình tự và đi lên lại ngưỡng?

  • Chúng tôi di chuyển điểm cuối về phía trước cho đến khi chênh lệch lớn hơn hoặc bằng yêu cầu.
    for _ in range(2):
        try:
            f()
        except NameError:
            print("f() didn't exist")
    
        def f():
            print("Hello world")
    
    75,
    for _ in range(2):
        try:
            f()
        except NameError:
            print("f() didn't exist")
    
        def f():
            print("Hello world")
    
    76,
    for _ in range(2):
        try:
            f()
        except NameError:
            print("f() didn't exist")
    
        def f():
            print("Hello world")
    
    77, ________ 578, ________ 579, ________ 580, ________ 581
  • Sau đó, chúng tôi đi từ điểm xuất phát về phía trước cho đến khi chúng tôi giảm xuống dưới mức yêu cầu.
    for _ in range(2):
        try:
            f()
        except NameError:
            print("f() didn't exist")
    
        def f():
            print("Hello world")
    
    87,
    for _ in range(2):
        try:
            f()
        except NameError:
            print("f() didn't exist")
    
        def f():
            print("Hello world")
    
    89,
    for _ in range(2):
        try:
            f()
        except NameError:
            print("f() didn't exist")
    
        def f():
            print("Hello world")
    
    01
  • Sau đó, chúng tôi quay lại đi bộ về phía trước điểm cuối cho đến khi đáp ứng lại yêu cầu.
    for _ in range(2):
        try:
            f()
        except NameError:
            print("f() didn't exist")
    
        def f():
            print("Hello world")
    
    91
  • Sau đó, chúng tôi quay trở lại đi bộ về phía trước điểm xuất phát. ________ 603, ________ 604
  • Đi bộ điểm cuối về phía trước.
    for _ in range(2):
        try:
            f()
        except NameError:
            print("f() didn't exist")
    
        def f():
            print("Hello world")
    
    05
  • Đi về phía trước điểm xuất phát. ________ 606, ________ 607
  • Đi bộ điểm cuối về phía trước.
    for _ in range(2):
        try:
            f()
        except NameError:
            print("f() didn't exist")
    
        def f():
            print("Hello world")
    
    08
  • Đi về phía trước điểm xuất phát.
    for _ in range(2):
        try:
            f()
        except NameError:
            print("f() didn't exist")
    
        def f():
            print("Hello world")
    
    09
  • Đi bộ điểm cuối về phía trước. cuối danh sách

Ngắn gọn hơn,

  • Trong khi tổng công suất yêu cầu không được đáp ứng,
    • đi bộ điểm cuối về phía trước
  • Trong khi tổng công suất yêu cầu được đáp ứng,
    • Nếu tổng công suất nhỏ hơn công suất nhỏ nhất được tìm thấy cho đến nay
      • cập nhật cái nhỏ nhất được tìm thấy cho đến nay và ghi nhớ điểm bắt đầu và điểm kết thúc
    • đi bộ điểm bắt đầu về phía trước

Lưu ý rằng chúng ta chỉ di chuyển điểm bắt đầu và điểm kết thúc qua danh sách một lần. Đây là \$O(N)\$

chạy tổng số

Bạn không phải tính toán trước và lưu trữ tổng số đang chạy. Bạn chỉ có thể giữ hai tổng số đang chạy khi bạn di chuyển điểm bắt đầu và điểm kết thúc về phía trước

Bạn thậm chí không cần hai tổng số. Chỉ cần cộng hoặc trừ từ một tổng số đang chạy. Hoặc xem xét tổng số là

for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
00 và khởi tạo nó với giá trị âm của yêu cầu năng lượng. Khi
for _ in range(2):
    try:
        f()
    except NameError:
        print("f() didn't exist")

    def f():
        print("Hello world")
01, yêu cầu năng lượng được đáp ứng;