[英]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.