9
myList = [ 4,'a', 'b', 'c', 1 'd', 3]

このリストを2つのリストに分割し、1つは文字列を含み、もう1つは整数をエレガント/パイソンの方法で含む方法を教えてください。

出力:

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

myIntList = [ 4, 1, 3 ]

注:そのようなリストは実装していません。そのような問題に対するエレガントな答え(何かありますか?)を見つける方法を考えただけです。

4

9 に答える 9

16

他の人がコメントで述べているように、そもそも不均一なデータを保持しているリストをどのように取り除くことができるかについて本当に考え始める必要があります。ただし、それが実際に実行できない場合は、defaultdictを使用します。

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

print d[int]
print d[str]
于 2013-02-08T16:28:38.410 に答える
11

リスト内包表記を使用できます:-

>>> 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']
于 2013-02-08T16:30:47.697 に答える
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']
于 2013-02-08T16:32:35.870 に答える
2

元のリストで見つかったタイプに従ってリストを分割します

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]}
于 2013-02-08T16:59:33.720 に答える
0

Pythonの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
于 2014-09-03T17:53:00.900 に答える
0

このコードを例として使用すると、文字列内の整数をチェックする関数isdigit()を使用して、2つの異なるリストを作成できます。

ip=['a',1,2,3]
m=[]
n=[]
for x in range(0,len(ip):
    if str(ip[x]).isdigit():
        m.append(ip[x])
    else:n.append(ip[x])
print(m,n)
于 2018-03-31T17:22:13.443 に答える
0
n = (input("Enter  string and digits: "))
d=[]
s=[]
for  x in range(0,len(n)):
    if str(n[x]).isdigit():
        d.append(n[x])
    else
        s.append(n[x])
print(d)
print(s)

編集1:これは別の解決策です

import re
x = input("Enter any string that contains characters and integers: ")
s = re.findall('[0-9]',x)
print(s)
c = re.findall('[a-z/A-Z]',x)
print(c)
于 2018-12-08T08:53:45.327 に答える
0
myList = [ 4,'a', 'b', 'c', 1 'd', 3]

myList_string = []
myList_number = []

for a in myList:
  if type(a) == int or type(a) == float:
    myList_number.append(a)
  elif type(a) == str:
    myList_string.append(a)
于 2022-02-10T15:00:05.890 に答える
-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)
于 2017-03-13T11:13:43.750 に答える