Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中过滤列表_Python_Python 2.7 - Fatal编程技术网

如何在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])