[英]How can I combine lists within a list into a single list?
当我从模型中提取数据时,数据会出现在列表中。 我想将此传入数据显示为单个列表。 我为此尝试了一些东西,但它出现在不同的索引中。
class Tickets():
def __init__(self,username):
self.username = username
def getTicketList(self):
ticketList = []
userTicketModel = CekilisModel.objects.filter(username=self.username)
userCount = userTicketModel.count()
if(userCount > 0):
while userCount > 0:
userCount -= 1
ticketList.append(userTicketModel[userCount].tickets)
ticketList.extend(ticketList)
print(ticketList)
return(userTicketModel)
输出:
["['J2V6UEQ', 'OOKXWXY', 'VXC7FGR']", "['J2V6UEQ', 'OOKXWXY', 'VXC7FGR']", "['J2V6UEQ', 'OOKXWXY', 'VXC7FGR']", 'Y666KCF', "['J2V6UEQ', 'OOKXWXY', 'VXC7FGR']", "['J2V6UEQ', 'OOKXWXY', 'VXC7FGR']", "['J2V6UEQ', 'OOKXWXY', 'VXC7FGR']", 'Y666KCF']
我想要的示例输出:
['J2V6UEQ', 'OOKXWXY', 'VXC7FGR', 'J2V6UEQ', 'OOKXWXY', 'VXC7FGR', 'J2V6UEQ', 'OOKXWXY', 'VXC7FGR']
将这些字符串列表解析为实际列表的最简单方法可能是使用eval()
,尽管我不确定它是否是最好的方法。 这是使用eval()
执行所需操作的代码:
from functools import reduce
# this assumes your individual strings are all of length 7 like in example
# `l` is the name of the list containing your `output`
l = [eval(x) if len(x) > 7 else [x] for x in l]
# then flatten the array using functools.reduce
l = reduce(lambda x, y: x+y, l)
另请注意,我不确定您的代码的目的是什么以及output
的来源。 如果它来自一些无效的用户输入,那么使用eval()
将是一个巨大的安全问题,因为它本质上是执行作为字符串传递给它的代码。
正如@Arch113 所说, eval 是一个好方法:
o=["['J2V6UEQ', 'OOKXWXY', 'VXC7FGR']", "['J2V6UEQ', 'OOKXWXY', 'VXC7FGR']", "['J2V6UEQ', 'OOKXWXY', 'VXC7FGR']", 'Y666KCF', "['J2V6UEQ', 'OOKXWXY', 'VXC7FGR']", "['J2V6UEQ', 'OOKXWXY', 'VXC7FGR']", "['J2V6UEQ', 'OOKXWXY', 'VXC7FGR']", 'Y666KCF']
l = [eval(x) if len(x) > 7 else [x] for x in o]
print(sum(l, []))
#output
['J2V6UEQ', 'OOKXWXY', 'VXC7FGR', 'J2V6UEQ', 'OOKXWXY', 'VXC7FGR', 'J2V6UEQ', 'OOKXWXY', 'VXC7FGR', 'Y666KCF', 'J2V6UEQ', 'OOKXWXY', 'VXC7FGR', 'J2V6UEQ', 'OOKXWXY', 'VXC7FGR', 'J2V6UEQ', 'OOKXWXY', 'VXC7FGR', 'Y666KCF']
正确的方法是编写一个解析器,将单个数据响应转换为实际列表。 由于字符串看起来大多与 Json 兼容,因此我会在它们上运行 Json 解析器。 只需将'
替换为"
。例如:
import json
def _parse_tickets_response(tickets: str) -> List[str]:
return json.loads(tickets.replace("'", '"'))
class Tickets():
def __init__(self, username):
self.username = username
def getTicketList(self):
ticketList = []
userTicketModel = CekilisModel.objects.filter(username=self.username)
userCount = userTicketModel.count()
if userCount > 0:
while userCount > 0:
userCount -= 1
ticketList.extend(
_parse_tickets_response(
userTicketModel[userCount].tickets
)
)
print(ticketList)
return(userTicketModel)
顺便说一句,Python 使用较小的蛇形大小写。
请不要建议评估。 更不用说这是一个风险。 尤其是当您使用ast.literal_eval代替时。
只是不要。
# this was formatted through `black`, mostly for the list comprehension bit
from ast import literal_eval
input_ = [
"['J2V6UEQ', 'OOKXWXY', 'VXC7FGR']",
"['J2V6UEQ', 'OOKXWXY', 'VXC7FGR']",
"['J2V6UEQ', 'OOKXWXY', 'VXC7FGR']",
"Y666KCF",
"['J2V6UEQ', 'OOKXWXY', 'VXC7FGR']",
"['J2V6UEQ', 'OOKXWXY', 'VXC7FGR']",
"['J2V6UEQ', 'OOKXWXY', 'VXC7FGR']",
"Y666KCF",
]
output_ = []
for v in input_:
if v.startswith("[") and v.endswith("]"):
v = literal_eval(v)
else:
v = [v]
output_.extend(v)
print(output_)
# partially using a list comprehension, which can be faster
# the formatting isn't necessary, you could have it all on one line instead.
output_ = []
[
output_.extend(v2)
for v in input_
if (v2 := literal_eval(v) if v.startswith("[") and v.endswith("]") else [v])
]
print(output_)
#cribbing the sum function from Talha's answer to make it more functional
output_ = sum(
[
literal_eval(v) if v.startswith("[") and v.endswith("]") else [v]
for v in input_
],
[],
)
print(output_)
['J2V6UEQ', 'OOKXWXY', 'VXC7FGR', 'J2V6UEQ', 'OOKXWXY', 'VXC7FGR', 'J2V6UEQ', 'OOKXWXY', 'VXC7FGR', 'Y666KCF', 'J2V6UEQ', 'OOKXWXY', 'VXC7FGR', 'J2V6UEQ', 'OOKXWXY', 'VXC7FGR', 'J2V6UEQ', 'OOKXWXY', 'VXC7FGR', 'Y666KCF']
['J2V6UEQ', 'OOKXWXY', 'VXC7FGR', 'J2V6UEQ', 'OOKXWXY', 'VXC7FGR', 'J2V6UEQ', 'OOKXWXY', 'VXC7FGR', 'Y666KCF', 'J2V6UEQ', 'OOKXWXY', 'VXC7FGR', 'J2V6UEQ', 'OOKXWXY', 'VXC7FGR', 'J2V6UEQ', 'OOKXWXY', 'VXC7FGR', 'Y666KCF']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.