繁体   English   中英

在python中使用集合和列表来创建一个新列表

[英]Use sets and lists in python to create a new list

我有以下动态数据,但以下是它可能的示例:

# An incoming List of lists with only ints
# For exampe the incoming_list could be:
incoming_list = [[1,2]. [3]]

# The indexes are like so:
0: [1,2]
1: [3]

然后我有一个 check_list ,其中包含一些示例数据(将是动态的),如下所示:

# A List[int] for check_list
check_list= [3]

如果任何传入列表数据在它的索引中,我然后需要获取incoming_list 上的第一个int:

# If the following were input:
incoming_list = [[1,2]. [3]]
check_list= [3]

# Then a new_list would be:
new_list = [3] because incoming_list has a list with 3 in it, and the 
first element of that list is 3

##############################################################

# Another example ff the following were input:
incoming_list = [[1,2]. [3]]
check_list= [2,3]

# Then a new_list would be:
new_list = [1,3] because incoming_list has a 2 in the first index and 
its first value is 1 and because incoming list has a 3 in the second index 
and its first and only value is 3

我试图用 set list 组合来做到这一点,但我认为 List 部分把它搞砸了:

new_list = list(set(v for k, v in incoming_lists if int(k) in check_list))

任何想法如何使这些干净优雅?

虽然不是很清楚你的意思,但我认为这应该可以工作。

new_list = []
check = set(check_list)

for sublist in incoming_list:
    for i in sublist:
        if i in check and sublist[0] not in new_list:
            new_list.append(sublist[0])
            continue

print(new_list)

输出

让我们尝试不同的incoming_listcheck_list值。

incoming_list = [[1, 2], [3]]
check_list = [2]

# Result: [1]
incoming_list = [[1, 2], [3], [2, 3, 5], [7, 8], [4, 3]]
check_list = [3]

# Result: [3, 2, 4]

在一般情况下,将列表预处理为O(1)查找结构可能是有意义的,该结构可以在线性时间内完成:

lookup = {}
for lst in reversed(incoming_list):
    for x in lst:
        lookup[x] = lst[0]

然后你可以简单地使用这个:

result = [lookup[x] for x in check_list]

针对问题中的给定输入实现所需结果的一种简单方法。 如果您正在寻找 1 行语句。

[l[0] for v in check_list for l in incoming_list if v in l]

In [33]: # EXAMPLE 1                                                                                                                                                                                        

In [34]: incoming_list = [[1,2], [3]]                                                                                                                                                                       

In [35]: check_list= [3]                                                                                                                                                                                    

In [36]: [l[0] for v in check_list for l in incoming_list if v in l]                                                                                                                                        
Out[36]: [3]

In [37]: # EXAMPLE 2                                                                                                                                                                                        

In [38]: incoming_list = [[1,2], [3]]                                                                                                                                                                       

In [39]: check_list= [2,3]                                                                                                                                                                                  

In [40]: [l[0] for v in check_list for l in incoming_list if v in l]                                                                                                                                        
Out[40]: [1, 3]

In [41]:  

对于我们在最终结果中有重复项更改的情况,您可以更新单行语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM