相关疑难解决方法(0)

如何将列表拆分为大小均匀的块?

我有一个任意长度的列表,我需要将它分成相同大小的块并对其进行操作.有一些明显的方法可以做到这一点,比如保留一个计数器和两个列表,当第二个列表填满时,将它添加到第一个列表并清空下一轮数据的第二个列表,但这可能非常昂贵.

我想知道是否有人对任何长度的列表都有一个很好的解决方案,例如使用生成器.

我一直在寻找有用的东西,itertools但我找不到任何明显有用的东西.但是可能会错过它.

相关问题:在块中迭代列表的最"pythonic"方法是什么?

python split list chunks

2068
推荐指数
40
解决办法
84万
查看次数

将发电机拆分成块而不预先行走

(这个问题与这一个这个问题有关,但那些是预先走动的发电机,这正是我想要避免的)

我想把一个发电机拆分成块.要求是:

  • 不填充块:如果剩余元素的数量小于块大小,则最后一个块必须更小.
  • 不要事先走动发电机:计算元件是昂贵的,而且只能通过消耗功能来完成,而不是通过消耗器来完成
  • 这意味着,当然:不要累积在内存中(没有列表)

我试过以下代码:

def head(iterable, max=10):
    for cnt, el in enumerate(iterable):
        yield el
        if cnt >= max:
            break

def chunks(iterable, size=10):
    i = iter(iterable)
    while True:
        yield head(i, size)

# Sample generator: the real data is much more complex, and expensive to compute
els = xrange(7)

for n, chunk in enumerate(chunks(els, 3)):
    for el in chunk:
        print 'Chunk %3d, value %d' % (n, el)
Run Code Online (Sandbox Code Playgroud)

这有点工作:

Chunk   0, value 0
Chunk   0, value 1 …
Run Code Online (Sandbox Code Playgroud)

python generator

47
推荐指数
4
解决办法
1万
查看次数

根据项目的长度以块的形式分割python列表

我在这里看到一些关于如何将Python列表拆分成块的好帖子,比如如何在常量大小的块中拆分可迭代的块.大多数帖子涉及分割块或将列表中的所有字符串连接在一起,然后根据正常的片段例程进行限制.

但是,我需要根据字符限制执行类似的操作.如果您有一个句子列表但不能截断列表中的任何切片.

我能够在这里制作一些代码:

def _splicegen(maxchars, stringlist):
    """
    Return a list of slices to print based on maxchars string-length boundary.
    """
    count = 0  # start at 0
    slices = []  # master list to append slices to.
    tmpslices = []  # tmp list where we append slice numbers.

    for i, each in enumerate(stringlist):
        itemlength = len(each)
        runningcount = count + itemlength
        if runningcount < int(maxchars):
            count = runningcount
            tmpslices.append(i)
        elif runningcount > int(maxchars):
            slices.append(tmpslices)
            tmpslices = []
            count …
Run Code Online (Sandbox Code Playgroud)

python list limit slice chunks

5
推荐指数
1
解决办法
2233
查看次数

如何批量使用可迭代对象(大小相同的块)?

我经常batch()在Python中使用。自 ES6 以来,JavaScript 中是否有其他具有迭代器和生成器函数的替代方案?

javascript generator ecmascript-6

5
推荐指数
1
解决办法
1607
查看次数

aws cli dynamo db (ValidationException) 错误

我正在寻找使用 python 的 boto3 模块向 dynamodb 批量写入项目,我得到了这个。这是我第一次使用 aws cli 或 boto3。文档说当存在空值和可能不正确的数据类型时会发生验证异常错误,但我已经玩过所有这些并且它似乎不起作用。

dynamodb 是否只喜欢一次写入 25 个项目?如果是这样,我如何控制这些批次?

我的请求:

client = boto3.client('dynamodb')
response = client.batch_write_item(RequestItems=batch_dict)
Run Code Online (Sandbox Code Playgroud)

batch_dict 的顶部:

{'scraper_exact_urls': [{'PutRequest': {'Item': {'Sku': {'S': 'T104P3'},
 'pps_id': {'N': '427285976'},
 'scraper_class_name': {'S': 'scraper_class_name'},
 'store_id': {'N': '1197386754'},
 'updated_by': {'S': 'user'},
 'updated_on': {'N': '1480714223'},
 'updated_url': {'S': 'http://www.blah.com'}}}},
 {'PutRequest': {'Item': {'Sku': {'S': 'T104P3'},
 'pps_id': {'N': '427285976'},
 'scraper_class_name': {'S': 'scraper_class_name'},
 'store_id': {'N': '1197386754'},
 'updated_by': {'S': 'user'},
 'updated_on': {'N': '1480714223'},
 'updated_url': {'S': 'http://www.blah.com'}}}},....
Run Code Online (Sandbox Code Playgroud)

架构:

属性:“pps_id”=>\Aws\DynamoDb\Enum\Type::NUMBER、“sku”=>\Aws\DynamoDb\Enum\Type::STRING、“scraper_class_name”=>\Aws\DynamoDb\Enum\Type: :STRING, "store_id"=>\Aws\DynamoDb\Enum\Type::NUMBER, "updated_url"=>\Aws\DynamoDb\Enum\Type::STRING, "updated_by"=>\Aws\DynamoDb\Enum\Type ::STRING, "updated_on"=>\Aws\DynamoDb\Enum\Type::NUMBER, 字段: …

python amazon-web-services amazon-dynamodb aws-cli

4
推荐指数
1
解决办法
4299
查看次数

使用Python将.csv文件分成多个块

我有一个很大的.csv文件,大小超过300 GB。我想将其分块成每个100,000,000行的较小文件(每行大约有55-60字节)。

我写了以下代码:

import pandas as pd
df = pd.read_csv('/path/to/really/big.csv',header=None,chunksize=100000000)
count = 1
for chunk in df:
    name = '/output/to/this/directory/file_%s.csv' %s count
    chunk.to_csv(name,header=None,index=None)
    print(count)
    count+=1
Run Code Online (Sandbox Code Playgroud)

这段代码可以正常工作,并且我在磁盘上有足够的内存来一次存储大约5.5-6 GB的内存,但是速度很慢

有没有更好的办法?

编辑

我编写了以下迭代解决方案:

with open('/path/to/really/big.csv', 'r') as csvfile:
    read_rows = csv.reader(csvfile)
    file_count = 1
    row_count = 1
    f = open('/output/to/this/directory/file_%s.csv' %s count,'w')
    for row in read_rows:
        f.write(''.join(row))
        row_count+=1
        if row_count % 100000000 == 0:
            f.close()
            file_count += 1
            f = open('/output/to/this/directory/file_%s.csv' %s count,'w')
Run Code Online (Sandbox Code Playgroud)

编辑2

我想提请注意Vor关于使用Unix / Linux split命令的评论,这是我找到的最快的解决方案。

python csv pandas

2
推荐指数
2
解决办法
4658
查看次数