我是Python的初学者。假设我有一个python列表的列表
list1 = [['id1','Jane','Doe',100,75,100],['id2','John','Snow',90,87,92],['id3','Peter','Pan',79,81,83]]
我如何搜索列表的列表,说'id2',并打印一个列表中只有整数的列表?
这是我尝试过的
import numbers
def list_search(lister,index):
for i in lister:
for j in i:
if j == index:
[x for x in i if isinstance(x, numbers.Number)]
print("Not found: ",index)
下面是我的函数
的测试list_search(list1,'id2')
我很期待(90、87、92)但我得到了未找到:id2
此解决方案在找到index
时停止循环。
如果没有找到index
,则返回None
。
使用列表推导式轻松创建列表。
不需要导入Number
,只需测试它是否为整数。
一个小的优化包括从第二行(item[:1]
)开始查找整数,因为我们知道第一行是索引。
如果假设第2行和第3行(Jane, Doe)总是字符串,您甚至可以在这里将1替换为3。
def list_search(lister, index):
for item in lister:
if item[0] == index:
return [x for x in item[1:] if isinstance(x, int)]
return None
这是为您提供整数的第一部分。计算给定列表的平均值是最简单的部分。
numbers = list_search(list1, "id2")
print(sum(numbers)/len(numbers))
这一行不做任何事情:
[x for x in i if isinstance(x, numbers.Number)]
你要么打印它,要么返回它。此外,你的函数将始终显示消息Not found
,所以你的代码应该像这样:
import numbers
list1 = [['id1','Jane','Doe',100,75,100],['id2','John','Snow',90,87,92],['id3','Peter','Pan',79,81,83]]
def list_search(lister,index):
for i in lister:
for j in i:
if j == index:
return [x for x in i if isinstance(x, numbers.Number)]
print("Not found: ",index)
my_list = list_search(list1,'id2')
print(my_list)
# print average
print( sum(my_list) / len(my_list))
输出:
[90, 87, 92]
89.66666666666667
这是您可以编写的函数。首先查看所有的第一个元素,如果第一个元素等于你想要的,然后检查整数并将它们附加到结果列表中。最后返回结果列表。
def func(a, activatedString):
result = []
for i in a:
if i[0] == activatedString:
for j in i:
if isinstance(i, int):
result.append(j)
return result
但是如果你想要更短的方式,你可以这样做:
def func(list1, activatedString):
return [i for i in [a for a in list1 if a[0] == activatedString][0] if isinstance(i, int)]
print(func(list1, "id2"))
让我们从只获取integers
列表开始:
list1 = [['id1','Jane','Doe',100,75,100],['id2','John','Snow',90,87,92],['id3','Peter','Pan',79,81,83]]
temp_integers = [list(filter(lambda x: isinstance(x, int), list1[i])) for i in range(len(list1))]
输出:
>>> temp_integers
... [[100, 75, 100], [90, 87, 92], [79, 81, 83]]
然后我们添加它们各自的means
的列表:
temp_means=[np.mean(x) for x in temp_integers]
输出:
>>> temp_means
... [91.66666666666667, 89.66666666666667, 81.0]
然后打印相应的整数到id2
和它们的mean
:
for i in range(len(list1)):
if 'id2' in list1[i]:
print(temp_integers[i])
print(temp_means[i])
把它们放在一个函数中
def list_search(lister,index):
temp_integers = [list(filter(lambda x: isinstance(x, int), lister[i])) for i in range(len(lister))]
temp_means=[np.mean(x) for x in temp_integers]
if all(index not in y for y in lister):
print("Not found: ",index)
else:
for i in range(len(lister)):
if index in lister[i]:
print(temp_integers[i])
print(temp_means[i])
>>> list_search(list1,'id2')
... [90, 87, 92]
... 89.66666666666667
使用尝试除之外的方法
list1 = [['id1','Jane','Doe',100,75,100],['id2','John','Snow',90,87,92],['id3','Peter','Pan',79,81,83]]
def list_search(list_of_list,index):
result=[]
for lis in list_of_list:
if lis[0]==index:
for check in lis:
try:
result.append(int(check))
except ValueError:
continue
return sum(result)/len(result) if result else 0
print(list_search(list1,"id2"))
输出: -
207.6666666
您可以使用列表推导:
list1 = [['id1','Jane','Doe',100,75,100],['id2','John','Snow',90,87,92],['id3','Peter','Pan',79,81,83]]
def list_search(lister, index):
return [j for i in lister for j in i if isinstance(j, int) and i[0] == index]
results = list_search(list1,'id2')
print(results)
average = sum(results)/len(results)
print(average)
# Output:
# [90, 87, 92]
# 89.66666666666667