如何在python中过滤列表
我如何过滤我的列表,这样我就可以创建一个只包含整数的单独列表,以便以后将它们相加 我的尝试:如何在python中过滤列表,python,python-2.7,Python,Python 2.7,我如何过滤我的列表,这样我就可以创建一个只包含整数的单独列表,以便以后将它们相加 我的尝试: dList= [['A1', 24], ['A2', 22], ['A3', 12], ['A4', 20], ['A5', 40], ['A6', 62], ['A7', 80], ['A8', 12], ['B1', 145], ['B2', 127], ['B3', 26], ['B4', 25], ['B
dList= [['A1', 24], ['A2', 22], ['A3', 12], ['A4', 20], ['A5', 40], ['A6', 62], ['A7', 80], ['A8', 12], ['B1', 145], ['B2', 127], ['B3', 26], ['B4', 25], ['B5', 91], ['B6', 38], ['B7', 21], ['B8', 12], ['C1', 122], ['C2', 87], ['C3', 36], ['C4', 3], ['D1', 0], ['D2', 5], ['D3', 55], ['D4', 62], ['D5', 98], ['D6', 32]]
def totalWales(dList):
sum = 0
numList = filter(operator.isNumberType, dList)
for x in numList:
sum = sum + int(numList)
print "Total wales: ", numList
您可以创建一个包含所有子列表索引1元素的新列表,该列表包含以下内容:
dList= [['A1', 24],
['A2', 22],
['A3', 12],
['A4', 20],
['A5', 40],
['A6', 62],
['A7', 80],
['A8', 12],
['B1', 145],
['B2', 127],
['B3', 26],
['B4', 25],
['B5', 91],
['B6', 38],
['B7', 21],
['B8', 12],
['C1', 122],
['C2', 87],
['C3', 36],
['C4', 3],
['D1', 0],
['D2', 5],
['D3', 55],
['D4', 62],
['D5', 98],
['D6', 32]]
newlist = [x[1] for x in dList]
print (newlist)
印刷品:
[24, 22, 12, 20, 40, 62, 80, 12, 145, 127, 26, 25, 91, 38, 21, 12, 122, 87, 36, 3, 0, 5, 55, 62, 98, 32]
1257
1257
要在不创建新列表的情况下求和,请执行以下操作:
sumDlist = sum(x[1] for x in dList)
print (sumDlist)
印刷品:
[24, 22, 12, 20, 40, 62, 80, 12, 145, 127, 26, 25, 91, 38, 21, 12, 122, 87, 36, 3, 0, 5, 55, 62, 98, 32]
1257
1257
如果在求和之前需要转换数字,请注意,如果不是数字,则上述解决方案将失败:
sumDlist = sum(float(x[1]) for x in dList))
额外:
如果你想快速检查号码,这个模块很好:这里
这样使用:
from fastnumbers import *
dList= [['A1', 24],
['A2', 22],
['A3', 12],
['A4', 20],
['A5', 40],
['A6', 62],
['A7', 80],
['A8', 12],
['B1', 145],
['B2', 127],
['B3', 26],
['B4', 25],
['B5', 91],
['B6', 38],
['B7', 21],
['B8', 12],
['C1', 122],
['C2', 87],
['C3', 36],
['C4', 3],
['D1', 0],
['D2', 5],
['D3', 55],
['D4', 62],
['D5', 98],
['D6', 32]]
sum_of_dList = 0
for sublist in dList:
if isreal(sublist[1]):
sum_of_dList += fast_real(sublist[1])
print (sum_of_dList)
印刷品:
[24, 22, 12, 20, 40, 62, 80, 12, 145, 127, 26, 25, 91, 38, 21, 12, 122, 87, 36, 3, 0, 5, 55, 62, 98, 32]
1257
1257
您可以使用一些拉链魔术:
在这里,zip选择每个列表中的第一个和第二个元素,并将它们放在单独的列表中,然后索引[1]将获得数字 如果dlist始终采用所示格式,您可以通过执行以下操作获得int的列表:
intlist = [i[1] for i in dlist]
这将从每个子列表的第二个元素创建一个新列表
相同的列表理解语法可用于直接计算您所追求的所有内容的总和:
intsum = sum (i[1] for i in dlist)
如果你只关心总数,那么这就行了
>>> sum(num for _,num in dList)
1257
顺便说一下
operator.isNumberTypeobj
自版本2.7以来已弃用:请改用isinstancex、numbers.Number
我是这样做的
dList= [['A1', 24], ['A2', 22], ['A3', 12], ['A4', 20], ['A5', 40], ['A6', 62], ['A7', 80], ['A8', 12], ['B1', 145], ['B2', 127], ['B3', 26], ['B4', 25], ['B5', 91], ['B6', 38], ['B7', 21], ['B8', 12], ['C1', 122], ['C2', 87], ['C3', 36], ['C4', 3], ['D1', 0], ['D2', 5], ['D3', 55], ['D4', 62], ['D5', 98], ['D6', 32]]
def totalWales(dList):
sum = 0
numList = []
for x in range(0, len(dList)):
for y in range(0, len(dList[x])):
if type(dList[x][y]) == int:
sum += dList[x][y]
numList.append(dList[x][y])
print "Total wales: ", numList
totalWales(dList)
我浏览了dList中的每一项,然后是该数组中的每一项。我检查了该项是否为int。如果是int,则求和并添加到numList看起来整数只是每个子列表中的第二个条目,因此dList.filter中x,y的sumy将对dList.filter中的每个元素应用operator.isNumberType谓词。由于dList的每个元素都是一个列表而不是一个数字,因此谓词将始终失败,筛选后的列表将为空。还要注意,operator.isNumberType已弃用,并且在Python 3中不存在。现代的替代方法是使用isinstancex,numbers.Number。在for循环中解包2个变量是否比查找1个变量快?x[1]是否仍被视为解包?我觉得这种方法比这里建议的任何其他方法效率更低、更不清晰。“如果这样做没有好处,为什么要使用zip?”WillDaSilva Clarity说,这取决于谁在读它,以及这个人习惯了什么,但我确实同意,它不那么直截了当。在当前的用例中,可能也没有那么多的优点,除了写起来稍微短一些之外:-我并不是说你对拉链的使用不清楚或不好。这不仅仅是这个简单问题所需要的。至少这可能会教一些新程序员遇到关于zip的问题。这就是为什么我喜欢Python和编程。一般来说,做事情的方法不止一种。回答得好!与使用列表/生成器理解的简单方法相比,这是不必要的复杂。@WillDaSilva我在最接近原始代码的地方回答了这个问题。这有什么错呢?原始代码很糟糕,我们不应该努力让我们的答案与之相似。代码应该易于阅读,简单的方法往往比复杂的方法更好。搜索Pythonic方法以获取更多信息。这将起作用,这样我可以使用新列表来获取总和。完全忘记了总和。谢谢
#Create a list with the numbers:
numList = [numbers for letters, numbers in dList]
#Set the result of the sum o the numbers to a variable:
result = sum(numList)
#Or if you just need the sum of the numbers:
result = sum([numbers for letters, numbers in dList])