Python 删除多个嵌套列表中的重复列表项
我有以下清单:Python 删除多个嵌套列表中的重复列表项,python,python-3.x,Python,Python 3.x,我有以下清单: values = [ ['registrationController', 'regBean', 'firstName'], ['registrationController', 'regBean', 'surname'], ['registrationController', 'regBean', 'userName'], ['registrationController', 'regBean', 'password'], ['regis
values = [
['registrationController', 'regBean', 'firstName'],
['registrationController', 'regBean', 'surname'],
['registrationController', 'regBean', 'userName'],
['registrationController', 'regBean', 'password'],
['registrationController', 'regBean', 'confirmPassword'],
['registrationController', 'regBean', 'emailAddress'],
['registrationController', 'regBean', 'confirmEmail'],
['registrationController', 'regBean', 'securityQuestionAndAnswerOne', 'question'],
['registrationController', 'regBean', 'securityQuestionAndAnswerOne', 'answer'],
['registrationController', 'regBean', 'securityQuestionAndAnswerTwo', 'question'],
['registrationController', 'regBean', 'securityQuestionAndAnswerTwo', 'answer'],
['registrationController', 'regBean', 'securityQuestionAndAnswerThree', 'question'],
['registrationController', 'regBean', 'securityQuestionAndAnswerThree', 'answer'],
['registrationController', 'regBean', 'tAndCAccepted']
]
我正在试图找出如何删除所有列表中预设的值,并将这些值保留在
某一时刻,当他们变得不愿意得到这样的东西时:
unique_values = [
['firstName'],
['surname'],
['userName'],
['password'],
['confirmPassword'],
['emailAddress'],
['confirmEmail'],
['securityQuestionAndAnswerOne', 'question'],
['securityQuestionAndAnswerOne', 'answer'],
['securityQuestionAndAnswerTwo', 'question'],
['securityQuestionAndAnswerTwo', 'answer'],
['securityQuestionAndAnswerThree', 'question'],
['securityQuestionAndAnswerThree', 'answer'],
['tAndCAccepted']
]
from collections import Counter
from itertools import chain
values = [
['registrationController', 'regBean', 'firstName'],
['registrationController', 'regBean', 'surname'],
['registrationController', 'regBean', 'userName'],
['registrationController', 'regBean', 'password'],
['registrationController', 'regBean', 'confirmPassword'],
['registrationController', 'regBean', 'emailAddress'],
['registrationController', 'regBean', 'confirmEmail'],
['registrationController', 'regBean', 'securityQuestionAndAnswerOne', 'question'],
['registrationController', 'regBean', 'securityQuestionAndAnswerOne', 'answer'],
['registrationController', 'regBean', 'securityQuestionAndAnswerTwo', 'question'],
['registrationController', 'regBean', 'securityQuestionAndAnswerTwo', 'answer'],
['registrationController', 'regBean', 'securityQuestionAndAnswerThree', 'question'],
['registrationController', 'regBean', 'securityQuestionAndAnswerThree', 'answer'],
['registrationController', 'regBean', 'tAndCAccepted']
]
counts = Counter(chain.from_iterable(values))
result = [[e for e in value if counts[e] != len(values)] for value in values]
print(result)
你知道我怎样才能做到吗?我尝试了各种方法,但无法真正找到有效的解决方案。假设列表中的每个值都是唯一的,您可以执行以下操作:
unique_values = [
['firstName'],
['surname'],
['userName'],
['password'],
['confirmPassword'],
['emailAddress'],
['confirmEmail'],
['securityQuestionAndAnswerOne', 'question'],
['securityQuestionAndAnswerOne', 'answer'],
['securityQuestionAndAnswerTwo', 'question'],
['securityQuestionAndAnswerTwo', 'answer'],
['securityQuestionAndAnswerThree', 'question'],
['securityQuestionAndAnswerThree', 'answer'],
['tAndCAccepted']
]
from collections import Counter
from itertools import chain
values = [
['registrationController', 'regBean', 'firstName'],
['registrationController', 'regBean', 'surname'],
['registrationController', 'regBean', 'userName'],
['registrationController', 'regBean', 'password'],
['registrationController', 'regBean', 'confirmPassword'],
['registrationController', 'regBean', 'emailAddress'],
['registrationController', 'regBean', 'confirmEmail'],
['registrationController', 'regBean', 'securityQuestionAndAnswerOne', 'question'],
['registrationController', 'regBean', 'securityQuestionAndAnswerOne', 'answer'],
['registrationController', 'regBean', 'securityQuestionAndAnswerTwo', 'question'],
['registrationController', 'regBean', 'securityQuestionAndAnswerTwo', 'answer'],
['registrationController', 'regBean', 'securityQuestionAndAnswerThree', 'question'],
['registrationController', 'regBean', 'securityQuestionAndAnswerThree', 'answer'],
['registrationController', 'regBean', 'tAndCAccepted']
]
counts = Counter(chain.from_iterable(values))
result = [[e for e in value if counts[e] != len(values)] for value in values]
print(result)
输出
[['firstName'], ['surname'], ['userName'], ['password'], ['confirmPassword'], ['emailAddress'], ['confirmEmail'], ['securityQuestionAndAnswerOne', 'question'], ['securityQuestionAndAnswerOne', 'answer'], ['securityQuestionAndAnswerTwo', 'question'], ['securityQuestionAndAnswerTwo', 'answer'], ['securityQuestionAndAnswerThree', 'question'], ['securityQuestionAndAnswerThree', 'answer'], ['tAndCAccepted']]
其思想是对值中的每个元素进行计数,并获取那些没有出现在值的所有元素中的元素:使用集合交集获取所有公共元素和嵌套列表,以构建清理后的列表:
common = set(values[0])
for lst in values[1:]:
common = common.intersection(lst)
unique_values = [[v for v in lst if v not in common] for lst in values]
通过列表理解:
>>> [
[elt for elt in line if not all(elt in subline for subline in values)]
for line in values
]
[['firstName'], ['surname'], ['userName'], ['password'], ['confirmPassword'], ['emailAddress'], ['confirmEmail'], ['securityQuestionAndAnswerOne', 'question'], ['securityQuestionAndAnswerOne', 'answer'], ['securityQuestionAndAnswerTwo', 'question'], ['securityQuestionAndAnswerTwo', 'answer'], ['securityQuestionAndAnswerThree', 'question'], ['securityQuestionAndAnswerThree', 'answer'], ['tAndCAccepted']]
请注意,输出是无序的这是一个易于理解和可读的版本。这也将维持秩序
common = set.intersection(*values)
reduced_values = [[value for value in l if value not in common] for l in values]
生成的列表是否仍然需要按顺序排列?是的,理想情况下,我需要将值映射回它们来自的原始列表。问题是删除所有通用值,而不是前两个。也许这正是他真正想要的。忘记提到嵌套列表可能会更大,并且不会像示例中那样总是有固定的长度。这一次,使用一个切片将它们挑选出来是可行的,但是切片出现的位置并不能保证。@SilverSlash更新了答案,现在它删除了所有列表中常见的元素。我看到@schobaselgg已经用几乎相同的代码回答了变量名。但为我辩护,当我发布我的答案时,我还没有看到他的答案。“便条”是什么?欢迎来到Stack Overflow!感谢您提供的代码片段,它可能会提供一些有限的、即时的帮助。一个恰当的解释将通过描述为什么这是一个很好的问题解决方案来极大地改进its,并将使它对未来有其他类似问题的读者更有用。请编辑您的答案,添加一些解释,包括您所做的假设。这是一个打字错误。我打算指出,该解决方案将输出一个未排序的结果