Numpy atleast_1d, но для списков - PullRequest
       2

Numpy atleast_1d, но для списков

0 голосов
/ 02 октября 2019

У меня есть функция, которая принимает в качестве аргумента либо список объектов, либо отдельный объект. Затем я хочу перебрать элементы списка или оперировать одним объектом, если это не список.

Ниже я использую numpy.atleast_1d().tolist(), чтобы убедиться, что цикл работает независимо от того, является ли аргумент списком или единственным объектом. Однако я не уверен, что преобразование объекта в массив numpy и затем в список может привести к непреднамеренным изменениям объекта.

Существует ли способ обеспечить преобразование аргумента в список, еслиэто не список? У меня есть два возможных решения в простом примере ниже, но я хотел бы знать, есть ли более лучшие.

import numpy as np

def printer1(x):
    for xi in np.atleast_1d(x).tolist():
        print(xi)

def printer2(x):
    if type(x) != list:
        x = [x]

    for xi in x:
        print(xi)

x1 = 'a'
x2 = ['a','b','c']

printer1(x1)
printer1(x2)

printer2(x1)
printer2(x2)

Я использую Python 2.7

Ответы [ 4 ]

1 голос
/ 03 октября 2019

Если вы хотите, чтобы циклические объекты были в основном нетронутыми, а нециклические объекты ведут себя как список из 1 элемента, вы можете сделать что-то вроде:

def forceiter(x):
    return getattr(x,"__iter__",lambda:(x,))()

Демо:

for x in [1,[2],range(3),"abc",(),{3:3,4:"x"}, np.logspace(0,3,4)]:
    print(x,end="  -->  ")
    for i in forceiter(x):
        print(i,end=" ")
    print()

# 1  -->  1 
# [2]  -->  2 
# range(0, 3)  -->  0 1 2 
# abc  -->  a b c 
# ()  -->  
# {3: 3, 4: 'x'}  -->  3 4 
# [   1.   10.  100. 1000.]  -->  1.0 10.0 100.0 1000.0 
1 голос
/ 02 октября 2019

Чтобы гарантировать, что элемент будет списком, даже если он имеет только один элемент, объявите его значение в квадратных скобках:

foo = ['stringexample']
foo2 = ['a','b']

for foos in foo:
    print (foos)

for foos2 in foo2:
    print (foos2)

Таким образом, даже если в 'foo' есть только одна строка,он по-прежнему будет работать как список только с одним элементом.

Также вы можете попробовать это:

declare a empty list 
use youremptylist.extend(incoming value)

Он будет повторять новый список для каждого входящего значения, даже если этоодин

1 голос
/ 02 октября 2019

Как говорит Рони, вы можете использовать это:

def printer(x):
  finalList = []
  finalList.extend(x)

  print finalList

, если x - единственное значение, оно будет добавлено к finalList, если x - список, он будетприсоединился к finalList, и вы можете перебрать его.

1 голос
/ 02 октября 2019
  • В вашей функции вы можете добавить проверку на массив. Я думаю, что это один из способов сделать это. Вам даже не нужно использовать numpy для этого.
def foo(x):
  x = [x] if not isinstance(x, list) else x
  printx # or do whatever you want to do
  # or
  for value in x:
    print value


foo('a')
foo(['a','b'])

вывод:

['a']
a
['a', 'b']
a
b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...