簡體   English   中英

如何將列表中的列表組合成一個列表?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM