2011-11-30 26 views
6

Một chuỗi có thể được tách ra và một số từ được gán cho một bộ bằng Python. Ví dụ:Có thể phân chia và gán một chuỗi trong một câu lệnh trong Python không?

a = "Jack and Jill went up the hill" 
    (user1 , user2) = a.split().pick(1,3) #picks 1 and 3 element in the list. 

Đây có phải là một lớp lót có thể không? Nếu vậy cú pháp là gì.

+0

Bạn có nghĩa là bạn cần giữ biến 'a' xung quanh sau khi tách? – BoltClock

+1

hmm, mọi người dường như đang cung cấp cho bạn các giải pháp cho phần tử 0 và 2 thay vì 1 và 3. Chỉ cần quan sát hài hước :) –

+0

Tôi không có ý định giữ biến. – sheki

Trả lời

13

Nếu bạn muốn nhận được ưa thích, bạn có thể sử dụng operator.itemgetter:

Return một đối tượng có thể được gọi là lấy về mục từ toán hạng của nó sử dụng phương pháp của toán hạng __getitem__(). Nếu nhiều mục được chỉ định, trả về một bộ giá trị tra cứu.

Ví dụ:

>>> from operator import itemgetter 
>>> pick = itemgetter(0, 2) 
>>> pick("Jack and Jill went up the hill".split()) 
('Jack', 'Jill') 

Hoặc như một lớp lót (w/o nhập khẩu):

>>> user1, user2 = itemgetter(0, 2)("Jack and Jill went up the hill".split()) 
+0

Đẹp (và đã dạy cho tôi điều gì đó mà tôi không biết)! Tuy nhiên, với tuyên bố nhập khẩu không phải là một lớp lót ... nhưng hai! ;) – mac

1

Đầu tiên mà nói đến cái tâm của tôi là:

>>> a = "Jack and Jill went up the hill" 
>>> [e for n, e in enumerate(a.split()) if n in (0, 2)] 
['Jack', 'Jill'] 

Trong trường hợp bạn tự hỏi: enumerate tạo bộ dữ liệu với một số tiến bộ như yếu tố đầu tiên và một phần tử của iterable liệt kê như thứ hai.

EDIT: Như đã nói trong các ý kiến ​​của @kindall, bước cuối cùng sẽ là:

>>> user1, user2 = [e for n, e in enumerate(a.split()) if n in (0, 2)] 
>>> user1 
'Jack' 
>>> user2 
'Jill' 

nhưng tôi quyết định không làm nhiệm vụ chỉ để giữ ví dụ hơn đến điểm (xin lỗi nếu người này nhầm lẫn).

+0

Đó là danh sách hiểu. Anh ta muốn một tuple. (Tôi cho rằng điều này có thể được giải quyết với một dàn diễn viên đơn giản, mặc dù ...) – BoltClock

+2

Để kết nối các dấu chấm cho người hỏi: 'user1, user2 = (e cho n, e trong liệt kê (a.split()) nếu n trong (0, 2)) '(Không, anh ta không yêu cầu một tuple, nhiều phép gán làm việc với bất kỳ chuỗi nào, thậm chí là một biểu thức máy phát.) – kindall

6

Bạn có thể làm một cái gì đó như thế này

a = "Jack and Jill went up the hill" 
user1, _, user2, _ = a.split(" ", 3) 

nơi _ nghĩa là chúng ta không quan tâm đến giá trị, và split(" ", 3) chia chuỗi trong 4 phân đoạn.

+1

Ingenius ... Nó không mở rộng nếu bạn chỉ muốn phần tử thứ 1024 trong danh sách của bạn mặc dù! ;) – mac

2

Tôi muốn làm điều này trong hai dòng, nhưng đây là một lớp lót:

user1, user2 = [token for (i, token) in enumerate(a.split()) if i in (0, 2)]

Dưới đây là những gì tôi sẽ làm gì để thay thế (chỉ dành riêng cho dễ đọc và ít có cơ hội giới thiệu lỗi nếu cần phải được thay đổi trong tương lai).

tokens = a.split() 
user1 = tokens[0] 
user2 = tokens[2] 
+0

Đó là câu trả lời cơ bản của tôi ... 2 phút sau bài viết của tôi. :( – mac

+0

Tại sao bạn cau mày? Bạn thắng cuộc đua :) –

2

Cắt lát hỗ trợ một số bước

a = "Jack and Jill went up the hill" 
(user1 , user2) = a.split()[0:4:2] #picks 1 and 3 element in the list 

nhưng trong khi nó có thể viết oneliners sôi nổi trong Python cho chắc chắn nó không phải là ngôn ngữ tốt nhất cho th ở dạng tập thể dục.

+0

Điều này chỉ hoạt động nếu các yếu tố để chọn đều đặn, phải không? – mac

+3

Nếu tất cả những người muốn là 2 elkements, họ sẽ có một "khoảng thời gian thường xuyên" :-) – jsbueno

1

này hiện các trick:

user1, user2 = a.split()[0::2][:2]

Chọn hai yếu tố đầu tiên của chuỗi đếm từ 2 trong 2.

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