将numpy数组全部读取为小写

时间:2019-03-22 20:42:40

标签: python list numpy

我有一本字典,其中的值是类似列表的列表:

my_dict = {'project': [['Address', 'STREET', '123 N Main St'],
                       ['Address', 'STREET', '100 N Main St']]}

我想检查一个列表中是否存在一个值,并且我一直在使用

for table in my_dict:
    if 'somevalue' in np.array(my_dict[table]):
        # do something

这很好,但是现在列表变大了,重复的值弹出了。我想.lower()数组中的所有内容以及字符串,以便阅读。像这样的东西不能按我想要的方式工作:

for table in my_dict:
    if 'somevalue'.lower() in np.array(my_dict[table]).lower():
        # do something

3 个答案:

答案 0 :(得分:1)

在此处创建OnFoo毫无意义,只会减慢速度。如果您担心的是使列表列表变平,np.array是实现这一目标的一种简洁方法:

itertools.chain.from_iterable

要全部小写,请使用from itertools import chain from timeit import timeit a = [['Address', 'STREET', '123 N Main St'], ['Address', 'STREET', '100 N Main St']] timeit(lambda: 'STREET' in np.array(a)) # 5.389413919008803 timeit(lambda: 'STREET' in chain.from_iterable(a)) # 0.29813046095659956

map

或生成器表达式。这也可以用来进行展平。

'street' in map(str.lower, chain.from_iterable(a))
# True

(拼合)列表理解的工作方式完全相同,但在这里会变慢。 (经验法则:如果只使用列表一次,然后丢弃它,则生成器表达式会更经济。)

'street' in (y.lower() for x in a for y in x)
# True

答案 1 :(得分:0)

我想出了一些解决方案(不知道这是最快还是最好的方法,但是确实有效)。我创建了另一个数组以便读取它,就像这样:

for table in my_dict:
    if 'somevalue'.lower() in np.array([[x.lower() for x in a] for a in my_dict[table]]):
        # do something

答案 2 :(得分:0)

np.char有很多函数,这些函数将字符串方法应用于数组的元素。它们的设计更多是为了方便而不是速度:

In [116]: arr = np.array(my_dict['project'])                                    
In [117]: arr                                                                   
Out[117]: 
array([['Address', 'STREET', '123 N Main St'],
       ['Address', 'STREET', '100 N Main St']], dtype='<U13')
In [118]: np.char.lower(arr)                                                    
Out[118]: 
array([['address', 'street', '123 n main st'],
       ['address', 'street', '100 n main st']], dtype='<U13')

或其他功能:

In [119]: np.char.capitalize(arr)                                               
Out[119]: 
array([['Address', 'Street', '123 n main st'],
       ['Address', 'Street', '100 n main st']], dtype='<U13')