将列表切片为最大字符串大小

时间:2016-03-30 23:23:49

标签: python

我有一个列表项的最大长度,我需要强制执行。我将如何完成以下任务:

MAX_LENGTH = 13
>>> str(["hello","david"])[:MAX_LENGTH]
"['hello', 'da"

==> ["hello", "da"]

我在考虑使用ast.literal_eval,但想知道这里可能会推荐什么。

4 个答案:

答案 0 :(得分:2)

我会反对这一点。必须有比这更安全的事情。至少你永远不应该将元素分成两半。例如:

import sys

overrun = []

data = ["Hello,"] + ( ["buffer"] * 80 )
maxsize = 800

# sys.getsizeof(data) is now 840 in my implementation.

while True:
    while sys.getsizeof(data) > maxsize:
        overrun.append(data.pop())
    do_something_with(data)
    if overrun:
        data, overrun = overrun, []
    else:
        break

答案 1 :(得分:1)

以下是我最终使用的@ AdamSmith答案的简化版本:

import sys
from copy import copy

def limit_list_size(ls, maxsize=800):
    data = copy(ls)
    while (sys.getsizeof(str(data)) > maxsize):
        if not data: break
        data.pop()
    return data

请注意,这不会拆分中间字。并且因为这将返回数据的副本,所以用户可以看到输出中排除了哪些项目。例如:

old_ls = [...]
new_ls = limit_list_size(old_ls)
overflow_ls = list(set(old_ls) - set(new_ls))

答案 2 :(得分:0)

如果你希望你的字符串MAX_LENGTH连接在一起,你可以用一个非常简单的循环来做,使用这样的东西:

 def truncateStringList(myArray)

    currentLength = 0
    result = []

    for string in myArray:
        if (currentLength + len(string)) > MAX_LENGTH:
            result.append(string[:len(string) + currentLength - MAX_LENGTH])
            return result
        else:
            result.append(string)
    return result

如果你想要它的字符串表示,你实际上在每个元素的开头添加了两个字符['',最后两个字符',或{ {1}},所以在循环中每个元素之前和之后将当前长度加2:

']

答案 3 :(得分:0)

带循环:

max = 11
mylist = ['awdawdwad', 'uppps']
newlist = ','.join(mylist)
print mylist
c= [x for x in newlist if not x==',']
if len(c)>max:
    newlist= list(newlist)
    newlist.reverse()
    for x in range(len(c)-max):
        if newlist[0]==',':
            del newlist[0]
            del newlist[0] # delete two times
        else:
            del newlist[0]
        while newlist[0]==',':
            del newlist[0]
newlist.reverse()
cappedlist =  ''.join(newlist).split(',')
print cappedlist