在嵌套列表中查找唯一元素

4
如果我有一个列表 mylist = ["[amn,b,c]", "[‘a,d,e’]", "[‘f,b,e’]"],我需要创建一个单一的列表,其中包含所有独特的元素为 [amn,b,c,d,e,f],我该如何实现?
我尝试编写函数和其他方法,但都没有成功。 函数:
mylist = ["[amn,b,c]", "[‘a,d,e’]", "[‘f,b,e’]"]

def print_list(the_list):

for each_item in the_list:

    if isinstance(each_item, list):

        print_list(each_item)

    else:

        print(each_item)

print_list(mylist)

输出:

[amn,b,c]

[‘a,d,e’]

[‘f,b,e’]

其他方法:

mylist = ["[amn,b,c]", "[‘a, d,e’]", "[‘f,b,e’]"]

mylist = str(mylist)

mylist = str(mylist)

mylist = [str(x) for x in (mylist)]

mylist = set(mylist)

i = {' ', "'", ',', '[', ']','‘', '’'}

mylist.difference_update(i)

mylist = list(mylist)

mylist.sort()

mylist

输出:

['a', 'b', 'c', 'd', 'e', 'f', 'm', 'n']

预期结果:

[amn,b,c,d,e,f]

实际结果:

使用该函数:

[amn,b,c]

[‘a,d,e’]

[‘f,b,e’]
使用另一种方法:
['a', 'b', 'c', 'd', 'e', 'f', 'm', 'n']

1
一个问题是您在列表的列表周围有引号,因此例如[amn,b,c]是一个字符串而不是一个列表。 - Hadi Farah
请随时查看其他答案,如果有用的话,考虑点赞。 - Swadhikar
4个回答

1
您可以使用以下列表推导式,其中使用 re.sub 来删除不需要的字符,底层列表是使用 .split 获得的,通过 , 进行分割。
最后,为了从嵌套列表中获取唯一元素,您可以使用 itertools.chain 来展开嵌套列表,并从结果生成一个 set 以保持唯一值:
import re
from itertools import chain
set(chain(*[re.sub(r'[\[‘’\"\]]', '', i).split(',') for i in mylist]))
{'a', 'amn', 'b', 'c', 'd', 'e', 'f'}

在哪里:

[re.sub(r'[\[‘’\"\]]', '', i).split(',') for i in mylist]
[['amn', 'b', 'c'], ['a', 'd', 'e'], ['f', 'b', 'e']]

1
使用正则表达式的回答很有趣。感谢分享! - Swadhikar
@Yatu,现在让我们把mylist改为 code mylist = [['动作,犯罪,戏剧'], ['动作,冒险,科幻'], ['动作,传记,戏剧'], ['冒险,戏剧,科幻'], ['动画,戏剧,奇幻'], ['传记,喜剧,戏剧'], ['戏剧,音乐'], ['动作,喜剧,悬疑'], ['喜剧,戏剧'], ['动作,冒险,科幻'], ['动画,动作,冒险']] code现在代码应该如何更改? - Nav

0

我必须以不同的方式重新定义列表,因为之前您有一个包含字符串的列表。如果这是错误的,请让我知道,但是我很好奇为什么您有一个类似列表的字符串列表。

mylist = [['amn','b','c'], ['a','d','e'], ['f','b','e']]
unique_list = []

def find_all_unique(input, unique_list):
    if type(input) is list:
        return [find_all_unique(x, unique_list) for x in input if x is not None]
    if type(input) is str:
        if input not in unique_list:
            unique_list.append(input)

find_all_unique(mylist, unique_list)
print(unique_list)

结果:

['amn', 'b', 'c', 'a', 'd', 'e', 'f']
[Finished in 0.081s]

或者,如果您需要将嵌套列表保留在引号内,可以使用以下方法:

mylist = [['amn','b','c', "['r','t','x']"], ['a','d','e'], ['f','b','e']]
unique_list = []

def find_all_unique(input, unique_list):
    if type(input) is list:
        return [find_all_unique(x, unique_list) for x in input if x is not None]
    if type(input) is str:
        if input.startswith('['):
            temp_list=[]
            exec("temp_list.append(" + input + ')', {"temp_list":temp_list})
            return [find_all_unique(x, unique_list) for x in temp_list if x is not None]
        elif input not in unique_list:
            unique_list.append(input)

find_all_unique(mylist, unique_list)
print(unique_list)

为了测试这个,我添加了一个带有字符串的列表"['r','t','x']",这应该捕获rtx作为唯一输入。

结果如下:

['amn', 'b', 'c', 'r', 't', 'x', 'a', 'd', 'e', 'f']
[Finished in 0.077s]

这将适用于列表、字符串列表和所有其他情况,因为该函数是递归的。


现在让我们将mylist更改为: mylist = [['动作,犯罪,戏剧'], ['动作,冒险,科幻'], ['动作,传记,戏剧'], ['冒险,戏剧,科幻'], ['动画,戏剧,奇幻'], ['传记,喜剧,戏剧'], ['戏剧,音乐'], ['动作,喜剧,神秘'], ['喜剧,戏剧'], ['动作,冒险,科幻'], ['动画,动作,冒险']]现在代码会如何更改? - Nav
添加了3行代码,这是我的结果:['动作','犯罪','戏剧','冒险','科幻','传记','动画','奇幻','喜剧','音乐','神秘'] - Hadi Farah

0
首先,我会尝试使用模式匹配将,(逗号)、'(单引号)和[](打开关闭的方括号)替换为空字符串。然后使用set去除重复项,并使用list重新构建列表,如下所示:
my_list = ["[amn,b,c]", "['a, d,e']", "['f,b,e']"]

result = sorted(list(set(([letter for word in my_list for letter in re.sub(',|\'|\[|]|\s+', '', word)]))))

print(result)

在哪里

re.sub(',|\'|\[|]|\s+', '', word)]) 

将替换字符串中的特殊字符。例如,['a, d,e'] 变为 ade

基于推导式的解决方案在技术上等同于

result = []

for word in my_list:  # Break list of lists to lists
    word = re.sub(',|\'|\[|]|\s+', '', word)
    for letter in word:  # Process each word in the sub list
        result.append(letter)

print('results with duplicates:    ', result)  # List with possible duplicates
result = set(result)  # Remove duplicates by converting to a set

result = list(result)  # Convert set back to list without duplicates (order is not preserved)
print('results without duplicates: ', result)

result = sorted(result)
print('results in sorted order:    ', result)

这将导致

results with duplicates:     ['a', 'm', 'n', 'b', 'c', 'a', 'd', 'e', 'f', 'b', 'e']
results without duplicates:  ['e', 'a', 'd', 'm', 'f', 'c', 'n', 'b']
results in sorted order:     ['a', 'b', 'c', 'd', 'e', 'f', 'm', 'n']

0
dd = []
mylist = ["[amn,b,c]", "[‘a,d,e’]", "[‘f,b,e’]"]
for i in mylist:
    dd.extend([''.join(filter(str.isalnum, j)) for j in i.split(",")])
print (list(set(dd)))
#output ['f', 'a', 'b', 'amn', 'c', 'd', 'e']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接