Hướng dẫn conditional sum in python - tính tổng có điều kiện trong python

Tôi đã tạo X như Folowing

num_locations = 2
X= [ ]
for n in range[num_locations]:
X.append[[0 for j in range[num_locations]]]

Bây giờ tôi muốn tổng hợp các giá trị x [n] [m] cho trường hợp n! = M. Như vậy mà kết quả sẽ giống như

X[0][1]+X[1][0]

Có cách nào để làm điều đó với công thức tổng?

X[n][m] for n in range[num_locations]for m in range[num_locations]]

hỏi ngày 17 tháng 6 năm 2016 lúc 14:06Jun 17, 2016 at 14:06

3

Điều này có hiệu quả lấy tổng các phần tử không đường chéo của mảng 2D của bạn. Một tùy chọn sử dụng Numpy có thể chỉ đơn giản là trừ đi tổng của đường chéo chính [

sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
2] khỏi tổng của toàn bộ mảng.

num_locations = 2
X= [[1,2],[2,1]]

import numpy as np
s = np.sum[X] - np.trace[X]
print[s]

Outputs::

4

Đã trả lời ngày 17 tháng 6 năm 2016 lúc 14:15Jun 17, 2016 at 14:15

Miradulomiradulomiradulo

Phù hiệu vàng 27,7K677 Huy hiệu bạc92 Huy hiệu đồng6 gold badges77 silver badges92 bronze badges

0

Bạn chỉ có thể sử dụng

sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
3

>>> sum[o for i, a in enumerate[X] for j, o in enumerate[a] if i!=j]
0

Trong đó

sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
4 và
sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
5 lần lượt là hàng [1st Dim] và cột [DIM thứ 2] tương ứng

Đã trả lời ngày 17 tháng 6 năm 2016 lúc 14:11Jun 17, 2016 at 14:11

Moses Koledoyemoses KoledoyeMoses Koledoye

76K8 Huy hiệu vàng125 Huy hiệu bạc133 Huy hiệu đồng8 gold badges125 silver badges133 bronze badges

Điều này sẽ hoạt động

sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]

Nó chạy trên mỗi hàng trong mảng 2D và tổng hợp nó, sau đó lấy ra ô

sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
4 [nếu tồn tại] để nó không được tổng hợp

Đã trả lời ngày 17 tháng 6 năm 2016 lúc 14:11Jun 17, 2016 at 14:11

Moses Koledoyemoses KoledoyeNeo

76K8 Huy hiệu vàng125 Huy hiệu bạc133 Huy hiệu đồng2 gold badges18 silver badges32 bronze badges

Bên cạnh tuyên bố

sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
7 vừa được giới thiệu, Python sử dụng các câu lệnh điều khiển dòng chảy thông thường được biết đến từ các ngôn ngữ khác, với một số vòng xoắn.

4.1.
sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
8 Báo cáo Jor
sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
8 Statements¶

Có lẽ loại tuyên bố nổi tiếng nhất là tuyên bố

sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
8. Ví dụ:

>>> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> # Measure some strings:
... words = ['cat', 'window', 'defenestrate']
>>> for w in words:
...     print[w, len[w]]
...
cat 3
window 6
defenestrate 12

Mã sửa đổi một bộ sưu tập trong khi lặp lại trên cùng một bộ sưu tập có thể là khó khăn để có được đúng. Thay vào đó, thường là lặp đi về phía trước để lặp qua một bản sao của bộ sưu tập hoặc để tạo một bộ sưu tập mới:

# Create a sample collection
users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}

# Strategy:  Iterate over a copy
for user, status in users.copy[].items[]:
    if status == 'inactive':
        del users[user]

# Strategy:  Create a new collection
active_users = {}
for user, status in users.items[]:
    if status == 'active':
        active_users[user] = status

4.3. Hàm
>>> # Measure some strings:
... words = ['cat', 'window', 'defenestrate']
>>> for w in words:
...     print[w, len[w]]
...
cat 3
window 6
defenestrate 12
2
The
>>> # Measure some strings:
... words = ['cat', 'window', 'defenestrate']
>>> for w in words:
...     print[w, len[w]]
...
cat 3
window 6
defenestrate 12
2 Function¶

Nếu bạn cần lặp lại một chuỗi các số, hàm tích hợp

>>> # Measure some strings:
... words = ['cat', 'window', 'defenestrate']
>>> for w in words:
...     print[w, len[w]]
...
cat 3
window 6
defenestrate 12
2 có ích. Nó tạo ra các tiến trình số học:

X[0][1]+X[1][0]
0

Điểm cuối đã cho không bao giờ là một phần của chuỗi được tạo ra;

>>> # Measure some strings:
... words = ['cat', 'window', 'defenestrate']
>>> for w in words:
...     print[w, len[w]]
...
cat 3
window 6
defenestrate 12
4 tạo ra 10 giá trị, các chỉ số pháp lý cho các mục có chuỗi độ dài 10. Có thể để phạm vi bắt đầu ở một số khác hoặc để chỉ định một mức tăng khác [thậm chí âm; đôi khi điều này được gọi là ‘bước,]:

X[0][1]+X[1][0]
1

Để lặp lại các chỉ số của một chuỗi, bạn có thể kết hợp

>>> # Measure some strings:
... words = ['cat', 'window', 'defenestrate']
>>> for w in words:
...     print[w, len[w]]
...
cat 3
window 6
defenestrate 12
2 và
>>> # Measure some strings:
... words = ['cat', 'window', 'defenestrate']
>>> for w in words:
...     print[w, len[w]]
...
cat 3
window 6
defenestrate 12
6 như sau:

X[0][1]+X[1][0]
2

Tuy nhiên, trong hầu hết các trường hợp như vậy, thuận tiện khi sử dụng hàm

>>> # Measure some strings:
... words = ['cat', 'window', 'defenestrate']
>>> for w in words:
...     print[w, len[w]]
...
cat 3
window 6
defenestrate 12
7, xem các kỹ thuật lặp.Looping Techniques.

Một điều kỳ lạ xảy ra nếu bạn chỉ in một phạm vi:

X[0][1]+X[1][0]
3

Theo nhiều cách, đối tượng được trả về bởi

>>> # Measure some strings:
... words = ['cat', 'window', 'defenestrate']
>>> for w in words:
...     print[w, len[w]]
...
cat 3
window 6
defenestrate 12
2 hành xử như thể đó là một danh sách, nhưng thực tế nó không phải là. Đó là một đối tượng trả về các mục liên tiếp của chuỗi mong muốn khi bạn lặp lại nó, nhưng nó không thực sự tạo ra danh sách, do đó tiết kiệm không gian.

Chúng tôi nói một đối tượng như vậy là có thể sử dụng được, nghĩa là phù hợp như một mục tiêu cho các chức năng và cấu trúc mong đợi một cái gì đó mà chúng có thể có được các mặt hàng liên tiếp cho đến khi nguồn cung bị cạn kiệt. Chúng tôi đã thấy rằng câu lệnh

>>> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> x = int[input["Please enter an integer: "]]
Please enter an integer: 42
>>> if x >> sum[o for i, a in enumerate[X] for j, o in enumerate[a] if i!=j]
0
0

Không có cuộc gọi nào có thể làm cho nó trả về

X[0][1]+X[1][0]
47 vì từ khóa
X[n][m] for n in range[num_locations]for m in range[num_locations]]
06 sẽ luôn liên kết với tham số đầu tiên. Ví dụ:

>>> sum[o for i, a in enumerate[X] for j, o in enumerate[a] if i!=j]
0
1

Nhưng sử dụng

X[0][1]+X[1][0]
86 [đối số chỉ có vị trí], có thể vì nó cho phép
X[n][m] for n in range[num_locations]for m in range[num_locations]]
02 làm đối số vị trí và
X[n][m] for n in range[num_locations]for m in range[num_locations]]
06 làm khóa trong các đối số từ khóa:

>>> sum[o for i, a in enumerate[X] for j, o in enumerate[a] if i!=j]
0
2

Nói cách khác, tên của các tham số chỉ có vị trí có thể được sử dụng trong

X[n][m] for n in range[num_locations]for m in range[num_locations]]
03 mà không có sự mơ hồ.

4.8.3.5. Tóm tắt lại¶Recap¶

Trường hợp sử dụng sẽ xác định sử dụng tham số nào trong định nghĩa hàm:

>>> sum[o for i, a in enumerate[X] for j, o in enumerate[a] if i!=j]
0
3

Theo hướng dẫn:

  • Sử dụng chỉ vị trí nếu bạn muốn tên của các tham số không có sẵn cho người dùng. Điều này rất hữu ích khi tên tham số không có ý nghĩa thực sự, nếu bạn muốn thực thi thứ tự của các đối số khi hàm được gọi hoặc nếu bạn cần lấy một số tham số vị trí và từ khóa tùy ý.

  • Sử dụng từ khóa chỉ khi tên có ý nghĩa và định nghĩa hàm dễ hiểu hơn bằng cách rõ ràng với tên hoặc bạn muốn ngăn người dùng dựa vào vị trí của đối số được truyền.

  • Đối với API, hãy sử dụng chỉ có vị trí để ngăn chặn các thay đổi API nếu tên tham số được sửa đổi trong tương lai.

4.8.4. Danh sách lập luận tùy ýArbitrary Argument Lists¶

Cuối cùng, tùy chọn ít được sử dụng nhất là chỉ định rằng một hàm có thể được gọi với số lượng đối số tùy ý. Những đối số này sẽ được kết thúc thành một tuple [xem các bộ dữ liệu và trình tự]. Trước khi có số lượng đối số, không có hoặc nhiều đối số bình thường hơn có thể xảy ra.Tuples and Sequences]. Before the variable number of arguments, zero or more normal arguments may occur.

>>> sum[o for i, a in enumerate[X] for j, o in enumerate[a] if i!=j]
0
4

Thông thường, các đối số variadic này sẽ là lần cuối cùng trong danh sách các tham số chính thức, bởi vì chúng tìm ra tất cả các đối số đầu vào còn lại được truyền cho hàm. Bất kỳ tham số chính thức nào xảy ra sau tham số

X[n][m] for n in range[num_locations]for m in range[num_locations]]
11 đều là đối số chỉ từ khóa, có nghĩa là chúng chỉ có thể được sử dụng làm từ khóa thay vì đối số vị trí.

>>> sum[o for i, a in enumerate[X] for j, o in enumerate[a] if i!=j]
0
5

4.8.5. Giải nén Danh sách đối sốUnpacking Argument Lists¶

Tình huống ngược lại xảy ra khi các đối số đã nằm trong danh sách hoặc tuple nhưng cần phải được giải nén cho một cuộc gọi chức năng yêu cầu các đối số vị trí riêng biệt. Chẳng hạn, hàm

>>> # Measure some strings:
... words = ['cat', 'window', 'defenestrate']
>>> for w in words:
...     print[w, len[w]]
...
cat 3
window 6
defenestrate 12
2 tích hợp mong đợi các đối số bắt đầu và dừng riêng biệt. Nếu chúng không có sẵn một cách riêng biệt, hãy viết cuộc gọi chức năng với ____ 137 người vận hành để giải nén các đối số ra khỏi danh sách hoặc tuple:

>>> sum[o for i, a in enumerate[X] for j, o in enumerate[a] if i!=j]
0
6

Trong cùng một thời trang, từ điển có thể cung cấp các đối số từ khóa với ________ 214-coper:

>>> sum[o for i, a in enumerate[X] for j, o in enumerate[a] if i!=j]
0
7

4.8.6. Biểu thức Lambda¶Lambda Expressions¶

Các hàm ẩn danh nhỏ có thể được tạo với từ khóa

X[n][m] for n in range[num_locations]for m in range[num_locations]]
15. Hàm này trả về tổng của hai đối số của nó:
X[n][m] for n in range[num_locations]for m in range[num_locations]]
16. Các hàm Lambda có thể được sử dụng bất cứ nơi nào các đối tượng chức năng được yêu cầu. Chúng bị giới hạn về mặt cú pháp trong một biểu thức duy nhất. Về mặt ngữ nghĩa, chúng chỉ là đường cú pháp cho một định nghĩa chức năng bình thường. Giống như các định nghĩa chức năng lồng nhau, các hàm Lambda có thể tham chiếu các biến từ phạm vi chứa:

>>> sum[o for i, a in enumerate[X] for j, o in enumerate[a] if i!=j]
0
8

Ví dụ trên sử dụng biểu thức lambda để trả về một hàm. Một cách sử dụng khác là chuyển một chức năng nhỏ như một đối số:

>>> sum[o for i, a in enumerate[X] for j, o in enumerate[a] if i!=j]
0
9

4.8.7. Chuỗi tài liệuDocumentation Strings¶

Dưới đây là một số quy ước về nội dung và định dạng của chuỗi tài liệu.

Dòng đầu tiên phải luôn luôn là một bản tóm tắt ngắn gọn, ngắn gọn về mục đích của đối tượng. Đối với sự ngắn gọn, nó không nên nêu rõ ràng tên hoặc loại đối tượng, vì chúng có sẵn bằng các phương tiện khác [trừ khi tên xảy ra là một động từ mô tả hoạt động của chức năng]. Dòng này nên bắt đầu bằng một chữ cái viết hoa và kết thúc bằng một khoảng thời gian.

Nếu có nhiều dòng hơn trong chuỗi tài liệu, dòng thứ hai phải trống, phân tách trực quan bản tóm tắt với phần còn lại của mô tả. Các dòng sau đây phải là một hoặc nhiều đoạn mô tả các quy ước gọi đối tượng, các tác dụng phụ của nó, v.v.

Trình phân tích cú pháp Python không thoát khỏi thụt lề từ các chuỗi chuỗi đa dòng trong Python, do đó, các công cụ mà tài liệu xử lý phải dải thụt vào nếu muốn. Điều này được thực hiện bằng cách sử dụng quy ước sau. Dòng không trống đầu tiên sau dòng đầu tiên của chuỗi xác định lượng thụt vào toàn bộ chuỗi tài liệu. . . Các dòng được thụt vào ít hơn không nên xảy ra, nhưng nếu chúng xảy ra tất cả khoảng trắng hàng đầu của chúng nên bị tước. Tương đương của khoảng trắng phải được kiểm tra sau khi mở rộng các tab [đến 8 khoảng trống, thông thường].

Dưới đây là một ví dụ về tài liệu đa dòng:

sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
0

4.8.8. Chú thích chức năngFunction Annotations¶

Chú thích chức năng là thông tin siêu dữ liệu hoàn toàn tùy chọn về các loại được sử dụng bởi các chức năng do người dùng xác định [xem PEP 3107 và PEP 484 để biết thêm thông tin]. are completely optional metadata information about the types used by user-defined functions [see PEP 3107 and PEP 484 for more information].

Các chú thích được lưu trữ trong thuộc tính

X[n][m] for n in range[num_locations]for m in range[num_locations]]
17 của hàm dưới dạng từ điển và không có tác dụng đối với bất kỳ phần nào khác của hàm. Các chú thích tham số được xác định bởi một dấu hai chấm sau tên tham số, theo sau là một biểu thức đánh giá theo giá trị của chú thích. Các chú thích trả lại được xác định bởi một
X[n][m] for n in range[num_locations]for m in range[num_locations]]
18 theo nghĩa đen, theo sau là một biểu thức, giữa danh sách tham số và đại tràng biểu thị kết thúc của câu lệnh
X[0][1]+X[1][0]
50. Ví dụ sau có một đối số bắt buộc, đối số tùy chọn và giá trị trả về được chú thích: are stored in the
X[n][m] for n in range[num_locations]for m in range[num_locations]]
17 attribute of the function as a dictionary and have no effect on any other part of the function. Parameter annotations are defined by a colon after the parameter name, followed by an expression evaluating to the value of the annotation. Return annotations are defined by a literal
X[n][m] for n in range[num_locations]for m in range[num_locations]]
18, followed by an expression, between the parameter list and the colon denoting the end of the
X[0][1]+X[1][0]
50 statement. The following example has a required argument, an optional argument, and the return value annotated:

sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
1

4.9. Intermezzo: Kiểu mãIntermezzo: Coding Style¶

Bây giờ bạn sắp viết những mảnh python dài hơn, phức tạp hơn, đây là thời điểm tốt để nói về phong cách mã hóa. Hầu hết các ngôn ngữ có thể được viết [hoặc súc tích hơn, được định dạng] theo các phong cách khác nhau; Một số dễ đọc hơn những người khác. Làm cho người khác dễ dàng đọc mã của bạn luôn là một ý tưởng tốt, và việc áp dụng một phong cách mã hóa đẹp giúp rất nhiều cho điều đó.

Đối với Python, Pep 8 đã nổi lên như một hướng dẫn phong cách mà hầu hết các dự án tuân thủ; Nó thúc đẩy một phong cách mã hóa rất dễ đọc và làm hài lòng. Mỗi nhà phát triển Python nên đọc nó tại một số điểm; Dưới đây là những điểm quan trọng nhất được trích xuất cho bạn:PEP 8 has emerged as the style guide that most projects adhere to; it promotes a very readable and eye-pleasing coding style. Every Python developer should read it at some point; here are the most important points extracted for you:

  • Sử dụng thụt 4 không gian, và không có tab.

    4 không gian là một sự thỏa hiệp tốt giữa vết lõm nhỏ [cho phép độ sâu làm tổ lớn hơn] và thụt lớn [dễ đọc hơn]. Các tab giới thiệu nhầm lẫn, và tốt nhất là bị bỏ rơi.

  • Bao bọc các dòng để chúng không vượt quá 79 ký tự.

    Điều này giúp người dùng có màn hình nhỏ và có thể có một số tệp mã bên cạnh các màn hình lớn hơn.

  • Sử dụng các dòng trống để phân tách các chức năng và các lớp và các khối mã bên trong các chức năng lớn hơn.

  • Khi có thể, hãy đặt ý kiến ​​trên một dòng của riêng họ.

  • Sử dụng tài liệu.

  • Sử dụng không gian xung quanh các toán tử và sau dấu phẩy, nhưng không trực tiếp bên trong các cấu trúc khung:

    X[n][m] for n in range[num_locations]for m in range[num_locations]]
    
    20.

  • Đặt tên cho các lớp học và chức năng của bạn một cách nhất quán; Công ước là sử dụng

    X[n][m] for n in range[num_locations]for m in range[num_locations]]
    
    21 cho các lớp và
    X[n][m] for n in range[num_locations]for m in range[num_locations]]
    
    22 cho các chức năng và phương pháp. Luôn luôn sử dụng
    X[n][m] for n in range[num_locations]for m in range[num_locations]]
    
    23 làm tên cho đối số phương thức đầu tiên [xem cái nhìn đầu tiên về các lớp để biết thêm về các lớp và phương thức].A First Look at Classes for more on classes and methods].

  • Don Tiết sử dụng các mã hóa ưa thích nếu mã của bạn được sử dụng trong môi trường quốc tế. Python sườn mặc định, UTF-8 hoặc thậm chí ASCII đơn giản hoạt động tốt nhất trong mọi trường hợp.

  • Tương tự như vậy, don lồng sử dụng các ký tự không phải ASCII trong các định danh nếu chỉ có cơ hội nhỏ nhất mà mọi người nói một ngôn ngữ khác sẽ đọc hoặc duy trì mã.

Chú thích

1

Trên thực tế, gọi theo tham chiếu đối tượng sẽ là một mô tả tốt hơn, vì nếu một đối tượng có thể thay đổi được truyền, người gọi sẽ thấy bất kỳ thay đổi nào mà callee thực hiện đối với nó [các mục được chèn vào danh sách].

Chủ Đề