web-dev-qa-db-ja.com

Python:リストが多次元か1次元かを確認します

私は現在pythonでプログラミングしており、ユーザーが多次元か1次元かを知らずに、ユーザーからリストを入力するメソッドを作成しました。どのように確認しますか?サンプル:


def __init__(self,target):    
    for i in range(len(target[0])):
        w[i]=np.random.Rand(len(example[0])+1)

ターゲットはリストです。問題は、target [0]がintである可能性があることです。

7
user2129468

私はあなたが欲しいと思います isinstance

使用例:

>>> a = [1, 2, 3, 4]
>>> isinstance(a, list)
True
>>> isinstance(a[0], list)
False
>>> isinstance(a[0], int)
True
>>> b = [[1,2,3], [4, 5, 6], [7, 8, 9]]
>>> isinstance(b[0], list)
True
13
Jack

コメントによると、とにかく入力をnumpy配列に変換しています。 _np.array_は、入力リストがネストされている深さの把握をすでに処理しているため、ネストされたリストからよりも、その配列から次元の数を見つける方が簡単です。

特に、配列には各次元に沿った配列の長さのタプルであるshape属性があるため、len(myarray.shape)は次元の数を示します。例えば、

_>>> import numpy as np
>>> a = np.array([[1,2,3],[1,2,3]])
>>> len(a.shape)
2
_
10
lvc

リストに含まれるディメンションの数を知りたい場合は、次のコードスニペットを使用できます。

def test_dim(testlist, dim=0):
   """tests if testlist is a list and how many dimensions it has
   returns -1 if it is no list at all, 0 if list is empty 
   and otherwise the dimensions of it"""
   if isinstance(testlist, list):
      if testlist == []:
          return dim
      dim = dim + 1
      dim = test_dim(testlist[0], dim)
      return dim
   else:
      if dim == 0:
          return -1
      else:
          return dim
a=[]
print test_dim(a)
a=""
test_dim(a)
print test_dim(a)
a=["A"]
print test_dim(a)
a=["A", "B", "C"]
print test_dim(a)
a=[[1,2,3],[1,2,3]]
print test_dim(a)
a=[[[1,2,3],[4,5,6]], [[1,2,3],[4,5,6]], [[1,2,3],[4,5,6]]]
print test_dim(a)
7
bunkus

これは非常に単純化されたソリューションです。ほとんどの場合、多次元のリスト/配列/マトリックスには、最初のインデックスにリストオブジェクトが含まれます。そうは言っても、pythonでは、データ型を定義する必要がないため、リストが[1、[2,3]、4]のリンクに見える場合、これは正しくない値を返す可能性があります。 -それ以外の場合は、すべての通常の多次元リストで機能するはずです。

def is2DList(matrix_list):
  if isinstance(matrix_list[0], list):
    return True
  else:
    return False
# list
list_1 = [1,2,3,4] # 1 x 4
list_2 = [ [1,2,3],[3,4,5] ] # 2 x 2
list_3 = [1, [2,3], 4]

print(is2DList(list_1)) # False
print(is2DList(list_2)) # True
print(is2DList(list_3)) # False - incorrect result

実際の動作をご覧ください: https://trinket.io/python/a937fe2f

0
Ryan Jones