表列计数和;在Python中搜索值

表列计数和;在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

假设我有一个叫做“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 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”的第一行代码的语法吗?我可以在文档的什么地方读到它?它是一个生成器表达式:@Nickl
len()
计算元素的数量,不管它们是什么
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)
方法。对于大型项目,这些方法无法扩展。