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

कैसे दो सूची है कि एक तार और अन्य में सुरुचिपूर्ण/pythonic रास्ता पूर्णांकों शामिल हो उसमें इस सूची विभाजित करने के लिए?अजगर - विभाजन सूची है कि तार और पूर्णांकों

उत्पादन:

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

myIntList = [ 4, 1, 3 ] 

नोट: इस तरह के एक सूची कार्यान्वित नहीं किया था, कितना एक सुरुचिपूर्ण जवाब खोजने के लिए के बारे में सोचा ऐसी समस्या के लिए (वहाँ किसी भी है?)।

+1

मैं तुम्हें एक नियमित अभिव्यक्ति – bozdoz

+0

imho की जरूरत है, यह बहुत बदसूरत solution.i'd बल्कि सूची और विभाजन से अधिक पुनरावृति है। – ayyayyekokojambo

+3

निरीक्षण प्रकार टाइप करने के लिए nonpythonic है, जैसा कि मिश्रित प्रकार की सूची बना रहा है। हो सकता है कि आपको बाद में इसके आसपास हैकिंग करने के बजाय, इनपुट पर अपने * उद्देश्य * के आधार पर डेटा को विभाजित करने के बारे में देखना चाहिए? – millimoose

उत्तर

12

जैसा कि अन्य ने टिप्पणियों में उल्लेख किया है, आपको वास्तव में इस बारे में सोचना शुरू करना चाहिए कि आप इस सूची से कैसे छुटकारा पा सकते हैं जिसमें पहले स्थान पर एकरूप डेटा है।

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

print d[int] 
print d[str] 
8

आप सूची समझ का उपयोग कर सकते हैं:: हालांकि, अगर है कि वास्तव में नहीं किया जा सकता है, मैं एक defaultdict का उपयोग करेंगे -

>>> 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

यह ठीक से काम करता है अगर प्रकार समय से पहले ज्ञात हैं और उनमें से बहुत से नहीं हैं :) – mgilson

+1

@mgilson .. हम्म। हाँ सही। हालांकि मुझे तुम्हारा रास्ता पसंद है। :) –

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

स्प्लिट सूची प्रकार के अनुसार मूल सूची में पाया गया

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

मैं पाइथन FAQ का जवाब देकर इस धागे को सारांशित करने जा रहा हूं "कैसे करें आप एक ऐसी विधि लिखते हैं जो किसी भी क्रम में तर्कों की संकीर्ण सीमा के बारे में तर्क लेता है? "

सभी तर्कों के बाएँ से सही क्रम मान लिया जाये कि महत्वपूर्ण नहीं हैं, इस कोशिश (@mgilson के उत्तर के आधार पर):

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... 

अब आप cook('string', 'string', range(..), range(..), range(..)) कॉल कर सकते हैं। तर्क आदेश अपने प्रकार के भीतर स्थिर है।

# 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

हालांकि यह कोड प्रश्न का उत्तर दे सकता है, इस सवाल का जवाब देने के तरीके के बारे में अतिरिक्त संदर्भ प्रदान करना और/या कैसे यह दीर्घकालिक मूल्य में सुधार करता है। –

संबंधित मुद्दे