Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.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_Count_Range - Fatal编程技术网

Python:提取特定范围内的数字数据

Python:提取特定范围内的数字数据,python,count,range,Python,Count,Range,我是一个Python初学者,尝试在大数据集中计算特定大小的数量。原始数据位于由选项卡分隔的文本文件中。我有不同动物的“名称”(字符串,但每一行看起来像一个列表),它们的“大小”(整数)在不同的行中。我想数一数在一定大小范围内的所有动物的数量,在10-30之间 到目前为止,我已经成功地计算了每个“名称”中有多少个,但没有指定“大小”。下面是我的代码,我没有收到任何错误,但是它被忽略了。谁能帮我解释一下为什么代码被忽略了?提前感谢您的帮助 import csv, collections reade

我是一个Python初学者,尝试在大数据集中计算特定大小的数量。原始数据位于由选项卡分隔的文本文件中。我有不同动物的“名称”(字符串,但每一行看起来像一个列表),它们的“大小”(整数)在不同的行中。我想数一数在一定大小范围内的所有动物的数量,在10-30之间

到目前为止,我已经成功地计算了每个“名称”中有多少个,但没有指定“大小”。下面是我的代码,我没有收到任何错误,但是它被忽略了。谁能帮我解释一下为什么代码被忽略了?提前感谢您的帮助

import csv, collections

reader=csv.reader(open('C:\Users\Owl\Desktop\Data.txt','rb'), delimiter='\t')
counts=collections.Counter()

for line in reader:
   Name=line[1]
   Size=line[10]
   counts[Name]+=1

for (Name, count) in counts.iteritems():
   if 10<=Size<=30:
      print '%s: %s' % (Name, count)
导入csv,集合
reader=csv.reader(打开('C:\Users\Owl\Desktop\Data.txt','rb'),分隔符='\t')
计数=集合。计数器()
对于行内读取器:
名称=行[1]
大小=行[10]
计数[名称]+=1
对于计数中的(名称、计数)。iteritems():
如果10
使
Size
成为字符串

10<=Size<=30
要解决此问题,请执行以下操作:

try:
    Size = float(line[10])
except (ValueError, IndexError):
    continue
上面的
try…except
将导致您的程序跳过csv文件中没有第11列或有无法转换为浮点的字符串的行


在Python2中,
int
s的比较小于
string
s

In [4]: 10 <= '1'
Out[4]: True

哈利路亚。

如前所述,
大小
将永久设置为文件中的最后一个大小值,它不会与
名称
一起存储

通过for循环的每一轮,
Size
都设置为
line[10]
,但它不会存储在循环范围之外的任何内容中<代码>名称
间接存储在计数器中。因此,下次循环运行时,
Size
的值将更改为下一个动物的大小

每种动物在数据中出现不止一次吗

您需要稍微复杂一点的数据结构,或者在循环文件时查看大小

如果您不介意忽略尺寸范围之外的动物:

for line in reader:
    size = float(line[10])
    if 10 <= size <= 30:
        name = line[1]
        counts[name] += 1

for name, count in counts.iteritems():
    print '%s: %s' % name, count
对于行内读取器:
大小=浮动(第[10]行)

如果10python的一个很酷的特性是字典中的键可以是非常高级的东西,比如。。。tadaaa!。。。元组(或者日期,或者很多东西……只要它是可散列的,正如J.F.塞巴斯蒂安所指出的——这里的散列并不违法)。将其与正则表达式相结合,您就有了一个非常奇特的“大小分类器”:-)

sizesFromFile = [
    "Name: Cat, Size: 3.2",
    "Name: Dog, Size: 4.2",
    "Name: BigFoot, Size: 12",
    "Name: Elephant, Size: 31.4",
    "Name: Whale, Size: 85.99",
]

import re
import sys
regex = re.compile(r"^Name:\s*(?P<name>\w+),\s+Size:\s+(?P<size>[\d\.]+)")

myRanges = {
    (0, 10): list(),
    (11, 20): list(),
    (21, 30): list(),
    (31, sys.maxint): list()
}

for line in sizesFromFile:
    match = regex.match(line)
    if match is not None:
        print "Success parsing %s, %s" % (match.groupdict()["name"], match.groupdict()["size"])
        name = match.groupdict()["name"]
        size = float(match.groupdict()["size"])
        for myRange in myRanges:
            if size >= myRange[0] and size <= myRange[1]:
                myRanges[myRange].append(name)

print "This is what I got: %s" % (myRanges)

虽然我很确定这是非常不理想的,速度说话。。。但它仍然很酷,对吗?

非常感谢您的快速响应!我刚刚尝试并得到一个错误值error:无法将字符串转换为float:Size如果
Size
包含字母和数字,则可能会发生这种情况。请尝试打印
Size
以查看它的大小。谢谢,我刚刚注意到数据的第一行是字符串数据,因为它们告诉我们每列是什么。有没有办法跳过第一行?owl,我在上面添加了一些代码来演示如何处理第一行。太好了!它最终没有导致错误!非常感谢你的帮助!!你们真的很棒!谢谢!!!:)对不起,我是个初学者。您所说的“它不与名称一起存储”是什么意思?我想这是我经常做的事,但我仍然很难理解我做错了什么…非常感谢你的帮助!我只是注意到大小是整数数据。因为我得到了一个错误ValueError:无法将字符串转换为float:Size,我尝试了Size=int(第[10]行),但得到了ValueError:对于以10为基数的int()无效的文本:“Size”。。。这是什么意思?我编辑了我的答案来解释for循环范围。该错误意味着第[10]行是字符串“size”,而不是整数。一个想法是:Python切片从0开始,所以第[10]行实际上是第11项。是否可能需要第[9]行?您可以将
name=line[1]
移动到
if
语句中,就像我的code@owl:要跳过第一行,您可以调用:
next(f)
,然后再将其传递给csv.reader(),其中
f
是您的文件。实际上,我正要评论一下,虽然我喜欢正则表达式,对于这种结构化的数据来说,这似乎有些过分了。OP还提到数据集是“大的”:)实际上,列表不能是dict键。只允许哈希对象谢谢您的帮助!有没有办法避免代码中的sizesFromFile部分?我的数据的问题是,它是非常大的,它是不可能写出来的所有。。。这就是为什么数据在txt文件中,而不是在Excel中(超过了行限制)。@J.F.Sebastian。。。该死!!正确的!Fixed@owl:是的,与“SizeFromFile”列表不同,只需将该行设置为从文件中读取的行(示例中的“line”变量…arg…这现在令人困惑…您可以逐行读取文件并使用正则表达式处理它)即可。readline():(而不是SizeFromFile中的行)对作为Windows路径的文本字符串使用
r'
修饰符:比较
r'c:\tmp'
'c:\tmp'
Python 3.2.2 (default, Sep  5 2011, 22:09:30) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 10 <= '1'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() <= str()
for line in reader:
    size = float(line[10])
    if 10 <= size <= 30:
        name = line[1]
        counts[name] += 1

for name, count in counts.iteritems():
    print '%s: %s' % name, count
sizesFromFile = [
    "Name: Cat, Size: 3.2",
    "Name: Dog, Size: 4.2",
    "Name: BigFoot, Size: 12",
    "Name: Elephant, Size: 31.4",
    "Name: Whale, Size: 85.99",
]

import re
import sys
regex = re.compile(r"^Name:\s*(?P<name>\w+),\s+Size:\s+(?P<size>[\d\.]+)")

myRanges = {
    (0, 10): list(),
    (11, 20): list(),
    (21, 30): list(),
    (31, sys.maxint): list()
}

for line in sizesFromFile:
    match = regex.match(line)
    if match is not None:
        print "Success parsing %s, %s" % (match.groupdict()["name"], match.groupdict()["size"])
        name = match.groupdict()["name"]
        size = float(match.groupdict()["size"])
        for myRange in myRanges:
            if size >= myRange[0] and size <= myRange[1]:
                myRanges[myRange].append(name)

print "This is what I got: %s" % (myRanges)
This is what I got: {(21, 30): [], (11, 20): ['BigFoot'], (0, 10): ['Cat', 'Dog'], (31, 2147483647): ['Elephant', 'Whale']}