繁体   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