python 从列表中获取一个元素,从3对中获取

laximzn5  于 2023-01-24  发布在  Python
关注(0)|答案(4)|浏览(156)

你好,我有一个列表中的元素是在下面给出的3对列表,

labels = ['', '', '5000','', '2', '','', '', '1000','mm-dd-yy', '', '','', '', '15','dd/mm/yy', '', '', '', '3', '','', '', '200','', '2', '','mm-dd-yy', '', '','', '', '','', '', '']

在上面的列表中,元素以3对出现,即(“”,“”,“5000”)一对,(“”,“2”,“”)第二对,(“mm-dd-yy”,“”,"“)第三对等等。
现在我想检查列表中的3对元素,并得到非空的元素。
(“,”,“5000”)给出“5000”
(“”,“2,”“)给出”2“
('mm-dd-yy','','')得出'mm-dd-yy'
并且如果所有三个都是空的,则它应该返回空,即
('','','')给出的''与列表中的最后2对相同
因此,从上面的列表中,我的输出应该是:

required_list = ['5000','2','1000','mm-dd-yy','15','dd/mm/yy','3','200','2','mm-dd-yy','','']
nuypyhwy

nuypyhwy1#

因为它是固定的,所以每次必须创建3对可以通过在range(start,end,step)中指定step来处理for循环

labels = ['', '', '5000','', '2', '','', '', '1000','mm-dd-yy', '', '','', '', '15','dd/mm/yy', '', '', '', '3', '','', '', '200','', '2', '','mm-dd-yy', '', '','', '', '','', '', '']
res1=[]
for i in range(0,len(labels),3):
    res1.append(labels[i]+labels[i+1]+labels[i+2])
print(res1)

#List Comprehension
res2=[labels[i]+labels[i+1]+labels[i+2] for i in range(0,len(labels),3)]

print(res2)
    • 输出:**
['5000', '2', '1000', 'mm-dd-yy', '15', 'dd/mm/yy', '3', '200', '2', 'mm-dd-yy', '', '']
8dtrkrch

8dtrkrch2#

我认为这应该会给予你所需的结果。不是理想的性能,但完成了工作,应该很容易遵循

labels = ['', '', '5000','', '2', '','', '', '1000','mm-dd-yy', '', '','', '', '15','dd/mm/yy', '', '', '', '3', '','', '', '200','', '2', '','mm-dd-yy', '', '','', '', '','', '', '']

    def chunks(ls):
        chunks = []

        start = 0
        end = len(ls)
        step = 3
        for i in range(start, end, step):
            chunks.append(ls[i:i+step])

        return chunks

    output = []
    for chunk in chunks(labels):
        nonEmptyItems = [s for s in chunk if len(s) > 0]
        if len(nonEmptyItems) > 0:
            output.append(nonEmptyItems[0])
        else:
            output.append('')

    print(output)
iyfjxgzm

iyfjxgzm3#

前面所有的答案都费力地创建了一个新的三元组列表,然后在这个三元组列表上迭代。
不需要创建此中间列表。

def gen_nonempty_in_triplets(labels):
    return [max(labels[i:i+3], key=len) for i in range(0, len(labels), 3)]

labels = ['', '', '5000','', '2', '','', '', '1000','mm-dd-yy', '', '','', '', '15','dd/mm/yy', '', '', '', '3', '','', '', '200','', '2', '','mm-dd-yy', '', '','', '', '','', '', '']
print(gen_nonempty_in_triplets(labels))
# ['5000', '2', '1000', 'mm-dd-yy', '15', 'dd/mm/yy', '3', '200', '2', 'mm-dd-yy', '', '']

有趣的是,有许多不同的方法可以实现“获取非空元素”。
我选择使用max(..., key=len)来选择最长的字符串。
几乎你收到的每一个答案都使用了不同的方法!
这里有几种不同的方法,当三元组中最多有一个非空元素时,它们是等价的,但是当三元组中包含两个或更多非空元素时,它们的行为就不同了。

# selects the longest string
max(labels[i:i+3], key=len)

# selects the first nonempty string
next((i for i in labels[i:i+3] if i), '')

# concatenates all three strings
labels[i]+labels[i+1]+labels[i+2]
j0pj023g

j0pj023g4#

迭代一个3分片列表,然后得到第一个非空元素next

labels = ['', '', '5000','', '2', '','', '', '1000','mm-dd-yy', '', '','', '', '15','dd/mm/yy', '', '', '', '3', '','', '', '200','', '2', '','mm-dd-yy', '', '','', '', '','', '', '']
length = len(labels)
list_by_3 = [labels[i:i+3] for i in range(0, length, 3)]

required_list = []
for triplet in list_by_3:
  required_list.append(
    next(i for i in triplet if i, "")
  )
>>> required_list
['5000', '2', '1000', 'mm-dd-yy', '15', 'dd/mm/yy', '3', '200', '2', 'mm-dd-yy', '', '']

相关问题