我有一个列表项的最大长度,我需要强制执行。我将如何完成以下任务:
MAX_LENGTH = 13
>>> str(["hello","david"])[:MAX_LENGTH]
"['hello', 'da"
==> ["hello", "da"]
我在考虑使用ast.literal_eval
,但想知道这里可能会推荐什么。
答案 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