2013-02-08 36 views
5
myList = [ 4,'a', 'b', 'c', 1 'd', 3] 

làm thế nào để chia danh sách này vào danh sách hai mà một trong chứa chuỗi và khác chứa số nguyên trong nhã/pythonic cách?Python - Danh sách Splitting Đó Có Strings và Số nguyên

đầu ra:

myStrList = [ 'a', 'b', 'c', 'd' ] 

myIntList = [ 4, 1, 3 ] 

Chú ý: không thực hiện một danh sách như vậy, chỉ nghĩ đến việc làm thế nào để tìm một câu trả lời tao nhã (là có bất kỳ?) Cho một vấn đề như vậy.

+1

tôi nghĩ rằng bạn cần một biểu thức chính quy – bozdoz

+0

IMHO, nó là solution.i'd rất xấu xí thay vì lặp qua danh sách và phân chia. – ayyayyekokojambo

+3

Kiểm tra các loại là nonpythonic để bắt đầu, như là tạo ra một danh sách kiểu hỗn hợp. Có lẽ bạn sẽ thấy về việc tách dữ liệu dựa trên mục đích * của nó * trên đầu vào, thay vì hack xung quanh nó sau này? – millimoose

Trả lời

12

Như những người khác đã đề cập trong các nhận xét, bạn thực sự nên bắt đầu suy nghĩ về cách bạn có thể loại bỏ danh sách chứa dữ liệu đồng nhất ngay từ đầu. Tuy nhiên, nếu đó thực sự không thể được thực hiện, tôi muốn sử dụng một defaultdict:

from collections import defaultdict 
d = defaultdict(list) 
for x in myList: 
    d[type(x)].append(x) 

print d[int] 
print d[str] 
8

Bạn có thể sử dụng danh sách hiểu: -

>>> myList = [ 4,'a', 'b', 'c', 1, 'd', 3] 
>>> myIntList = [x for x in myList if isinstance(x, int)] 
>>> myIntList 
[4, 1, 3] 
>>> myStrList = [x for x in myList if isinstance(x, str)] 
>>> myStrList 
['a', 'b', 'c', 'd'] 
+1

Điều này hoạt động tốt nếu các loại được biết trước và không có quá nhiều loại trong số đó :) – mgilson

+1

@mgilson .. Hmm. Đúng vậy. Tôi thích cách của bạn. :) –

3
def filter_by_type(list_to_test, type_of): 
    return [n for n in list_to_test if isinstance(n, type_of)] 

myList = [ 4,'a', 'b', 'c', 1, 'd', 3] 
nums = filter_by_type(myList,int) 
strs = filter_by_type(myList,str) 
print nums, strs 

>>>[4, 1, 3] ['a', 'b', 'c', 'd'] 
1

chia danh sách theo loại được tìm thấy trong danh sách gốc

myList = [ 4,'a', 'b', 'c', 1, 'd', 3] 
types = set([type(item) for item in myList]) 
ret = {} 
for typeT in set(types): 
    ret[typeT] = [item for item in myList if type(item) == typeT] 

>>> ret 
{<type 'str'>: ['a', 'b', 'c', 'd'], <type 'int'>: [4, 1, 3]} 
0

Tôi sẽ tóm tắt chủ đề này bằng cách trả lời một câu hỏi thường gặp về Python "cách thực hiện bạn viết một phương thức lấy đối số theo bất kỳ thứ tự nào, trong một phạm vi hẹp các loại? "

Giả sử thứ tự từ trái sang phải của tất cả các đối số là không quan trọng, hãy thử này (dựa trên câu trả lời @mgilson 's):

def partition_by_type(args, *types): 
    d = defaultdict(list) 

    for x in args: 
     d[type(x)].append(x) 

    return [ d[t] for t in types ] 

def cook(*args): 
    commands, ranges = partition_by_type(args, str, range) 

    for range in ranges: 
     for command in commands: 
      blah blah blah... 

Bây giờ bạn có thể gọi cook('string', 'string', range(..), range(..), range(..)). Thứ tự đối số là ổn định, trong loại của nó.

# TODO make the strings collect the ranges, preserving order 
-1
import strings; 
num=strings.digits; 
str=strings.letters; 
num_list=list() 
str_list=list() 
for i in myList: 
    if i in num: 
     num_list.append(int(i)) 
    else: 
     str_list.append(i) 
+0

Mặc dù mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung về lý do và/hoặc cách mã này trả lời câu hỏi cải thiện giá trị lâu dài của nó. –

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