我有一本字典,其中的值是类似列表的列表:
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
答案 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')