3

基本的に、次のような異なるタイプのアイテムのリストがあります

['a',1,'b',2,3,'c'] 

また

[{"A":1},1,{"B":2},{"C":3},"a"]

元の順序を維持しながら、これらを2つの別々のリストに分割したいと思います

[[ 'a', None,  'b', None, None,  'c'],
 [None,    1, None,    2,    3, None]]

また

[[{"A":1}, None, {"B":2},{"C":3}, None],
 [None,       1,    None,   None, None],
 [None,    None,    None,   None,  "a"]]

私が持っているもの:

def TypeSplit(sources)
  Types = [dict(),str(),num()]
  return [[item for item in sources if type(item) == type(itype)] for itype in types]  

これは記入しませんがNone

これを行っている理由は、さまざまな種類の情報を含むリストが与えられ、元のリストを補完する他の値で肉付けする必要があるためです。

これを行うより良い方法はありますか?

4

4 に答える 4

2

これは、条件式の適切な使用例です。また、可能な限り一般化された方法でこれを行いたいと考えているので、タイプの固定リストを使用する代わりに、リストを動的に生成することをお勧めします。

def type_split(sources):
    types = sorted(set(type(i) for i in sources))
    return [[item if type(item) == itype else None for item in sources] 
            for itype in types]  

固定リストを使用する必要がある場合 (そして、入力リストにそれらの型とそのサブクラス以外は何も含まれないことがわかっている場合)、次のようにすることができます。

import collections
import numbers
def type_split(sources):
    types = [basestring, collections.Mapping, numbers.Number]
    return [[item if isinstance(item, itype) else None for item in sources] 
            for itype in types] 
于 2012-07-25T13:06:12.913 に答える
2

を使用して、ここで少し異なるアプローチを取るかもしれませんdefaultdict:

from collections import defaultdict
def type_split(sources):
   d=defaultdict(lambda : [None]*len(sources))
   for i,src in enumerate(sources):
       d[type(src)][i] = src
   return d

これはリストではなく辞書を返しますが、さまざまな要素の型を内省する方が簡単です...リストのリストが本当に必要な場合は、いつでもd.values()(python2.xで)またはlist(d.values())python 3で見ることができます.バツ

于 2012-07-25T13:18:04.520 に答える
1
>>> def type_split(seq, types): 
        return [[x if isinstance(x, t) else None for x in seq] for t in types]

>>> type_split(['a',1,'b',2,3,'c'], (str, int))
[['a', None, 'b', None, None, 'c'], [None, 1, None, 2, 3, None]]
>>> type_split([{"A":1},1,{"B":2},{"C":3},"a"], (dict, int, str))
[[{'A': 1}, None, {'B': 2}, {'C': 3}, None], [None, 1, None, None, None], [None, None, None, None, 'a']]
于 2012-07-25T13:20:22.627 に答える
1

型の元の順序を順序付きキーとして保持する @mgilson によるソリューションの適応。

>>> from collections import OrderedDict
>>> def type_split(seq):
        d = OrderedDict()
        for i, x in enumerate(seq):
            d.setdefault(type(x), [None] * len(seq))[i] = x
        return d.values()

>>> type_split(['a',1,'b',2,3,'c'])
[['a', None, 'b', None, None, 'c'], [None, 1, None, 2, 3, None]]
>>> type_split([{"A":1},1,{"B":2},{"C":3},"a"])
[[{'A': 1}, None, {'B': 2}, {'C': 3}, None], [None, 1, None, None, None], [None, None, None, None, 'a']]
于 2012-07-25T14:04:04.710 に答える