表列计数和;在Python中搜索值
假设我有一个叫做“a”的多维表格:表列计数和;在Python中搜索值,python,list,search,count,Python,List,Search,Count,假设我有一个叫做“a”的多维表格: python中是否有内置函数来计算有多少列(4),而不是这样做 f = 0 for item in a: f = f + 1 我还可以把上面两行合并成一行吗 具有内置功能: 如何在第一列的名称中搜索以查找是否存在名称 如果存在值,如何搜索整个表 您想使用len内置: f = len(a) 正如保罗所指出的: len(your_list) # Returns number of rows (which is what I assume you mean
python中是否有内置函数来计算有多少列(4),而不是这样做
f = 0
for item in a: f = f + 1
我还可以把上面两行合并成一行吗
具有内置功能:
- 如何在第一列的名称中搜索以查找是否存在名称
- 如果存在值,如何搜索整个表
len
内置:
f = len(a)
正如保罗所指出的:
len(your_list) # Returns number of rows (which is what I assume you meant)
对于其他两个问题,这是最接近内置的:
>>> 'Paul' in (row[0] for row in your_list)
True
>>> 66 in itertools.chain.from_iterable(your_list)
True
对行使用
len
:
table=[['John', 8, 'Student' ],
['Paul', 22, 'Car Dealer'],
['Nick', 30, 'Doctor', 'this row is longer..','making 5'],
['Mark', 66, 'Retired' ]]
y=len(table) # 4
然后您必须逐行查找最大宽度:
x=max(len(row) for row in table) # 5
您可以使用列表理解来获取垂直列的值:
>>> [li[0] for li in table]
['John', 'Paul', 'Nick', 'Mark']
要查找值,可以使用具有任意或仅测试成员身份的生成器表达式:
any('John' in l for l in table) # True
'Paul' in (li[0] for li in table) # True
要查找哪一行,请使用列表:
[i for i,l in enumerate(table) if 'Mark' in l] # 3
使用数据库高效地执行所有这些操作:
创建并填充数据库:
import sqlite3
a = [['John', 8, 'Student' ],
['Paul', 22, 'Car Dealer'],
['Nick', 30, 'Doctor' ],
['Mark', 66, 'Retired' ]]
conn = sqlite3.connect('so.db')
c = conn.cursor()
c.execute('''CREATE TABLE data
(name text, age int, occupation text)''')
c.executemany('INSERT INTO data VALUES (?,?,?)', a)
conn.commit()
conn.close()
>>> conn = sqlite3.connect('so.db')
>>> c = conn.cursor()
正在数据库中搜索:
import sqlite3
a = [['John', 8, 'Student' ],
['Paul', 22, 'Car Dealer'],
['Nick', 30, 'Doctor' ],
['Mark', 66, 'Retired' ]]
conn = sqlite3.connect('so.db')
c = conn.cursor()
c.execute('''CREATE TABLE data
(name text, age int, occupation text)''')
c.executemany('INSERT INTO data VALUES (?,?,?)', a)
conn.commit()
conn.close()
>>> conn = sqlite3.connect('so.db')
>>> c = conn.cursor()
行数
:
>>> c.execute('''select count(*) from data''').next()
(4,)
按名称搜索
:
>>> c.execute('''select * from data where name="Paul"''').fetchall()
[(u'Paul', 22, u'Car Dealer')]
>>> c.execute('''select * from data where name="qwerty"''').fetchall()
[]
按年龄进行搜索:
>>> c.execute('''select * from data where age="66"''').fetchall()
[(u'Mark', 66, u'Retired')]
按职业搜索:
>>> c.execute('''select * from data where occupation="Engineer"''').fetchall()
[]
>>> c.execute('''select * from data where occupation="Doctor"''').fetchall()
[(u'Nick', 30, u'Doctor')]
如果只想将
True
和False
作为输出,请使用next
:
>>> bool(next(c.execute('''select * from data where age=36'''), 0))
False
>>> bool(next(c.execute('''select * from data where age=66'''), 0))
True
c.fetchall()
将返回所有匹配的行。这些行不是列。您要在表中搜索哪种类型的值?(提供一些示例)对于名称相关搜索,请将列表转换为dict以获取O(1)
查找。对不起,您是对的,它们被称为行。--有字母数字和数字两种。你能在下面发布一个方法吗?提供一些与搜索相关的示例,以便我们能够为你提供有效的解决方案。搜索示例是:名字列中是否存在“Nick”?一个人50岁吗?有工程师吗?这就是我要找的!你能解释一下返回“True”的第一行代码的语法吗?我可以在文档的什么地方读到它?它是一个生成器表达式:@Nickllen()
计算元素的数量,不管它们是什么a
是一个行列表
(恰好是列表
本身)。谢谢。为什么any(表中l为66英寸)返回true,而66英寸(表中li为66英寸)返回false?有什么区别?我在这篇评论中发布的第二个示例的语法是什么?(表中的li代表li)
只是在原始表上返回一个生成器。如果要查看此内容,请在解释器中键入[li for li in table]==table
。要特别查找66,请使用它所在行的字段:66 in(li[1]表示表中的li)
或使用any
您可以看到这是两个不同的表达式<如果在每行的任何位置都找到“66”,则code>any
将返回True。另一个表达式特定于列。(当然,这取决于类型…)这可能会起作用,但有一些方法可以在不创建新数据库的情况下起作用,那么采用这种方法的原因是什么?你给了我一些想法,所以还是谢谢你@Nickl您可以使用列表来实现这一点,但这些解决方案并不高效。除了len()
,any
,generator expr
,LC
之外,它们都是O(N)
方法。对于大型项目,这些方法无法扩展。