Python 删除元组中列表列表列表中的项

Python 删除元组中列表列表列表中的项,python,python-3.x,list,tuples,Python,Python 3.x,List,Tuples,我有一个元组列表,每个元组包含两个值。第一个值是字符串列表,第二个值是字符串: list_of_tuples = [(['this', 'askjsdaddsa', 'match1'], 'done'), (['sajs', 'skasassas', 'asdasdasdasd', 'qwerty'], 'doneagain')] 如何将元组中的第一个值减少为仅包含六个字母的字符串?理想情况下我会 final_list_of_tuples = [('match1' , 'done'), ('q

我有一个元组列表,每个元组包含两个值。第一个值是字符串列表,第二个值是字符串:

list_of_tuples = [(['this', 'askjsdaddsa', 'match1'], 'done'), (['sajs', 'skasassas', 'asdasdasdasd', 'qwerty'], 'doneagain')]
如何将元组中的第一个值减少为仅包含六个字母的字符串?理想情况下我会

final_list_of_tuples = [('match1' , 'done'), ('qwerty', 'doneagain')]
到目前为止,我有以下几点:

for a, b in dict_refine:
    a.remove(i for i in a if len(i) != 6)

我觉得好像有一件非常基本的事情,我正在吹过去。有没有一种方法可以在一行中完成?输出到字典会更容易吗

与Python中涉及更改列表的大多数任务一样,这里的作业工具可能是其中的两个:

>>> [([word for word in words if len(word) == 6], key) for (words, key) in list_of_tuples]
[(['match1'], 'done'), (['qwerty'], 'doneagain')]
内部理解
[如果len(word)==6,则逐字逐句]
希望是清晰的-这会将列表过滤到长度为6的单词。外部元组只将内部元组应用于每个元组的第一个元素并重建元组

当然,如果您直接使用这些值,则无需构建新列表,您可以正常迭代:

for (words, key) in list_of_tuples:
    six_letter_words = [word for word in words if len(word) == 6]
    ....

如果要在这些列表上支持多个6字母字符串,可以使用:

>>> l = [(['this', 'askjsdaddsa', 'match1'], 'done'), (['sajs', 'skasassas', 'asdasdasdasd', 'qwerty'], 'doneagain')]
>>> [([x for x in a if len(x) == 6], b) for a, b in l]
[(['match1'], 'done'), (['qwerty'], 'doneagain')]
>>> l = {'done': ['this', 'askjsdaddsa', 'match1'], 'doneagain': ['sajs', 'skasassas', 'asdasdasdasd', 'qwerty']}
>>> {k: next(x for x in v if len(x) == 6) for k, v in l.items()}
{'done': 'match1', 'doneagain': 'qwerty'}
您还可以获取字符串列表中的前6个字母字符串:

>>> l = [(['this', 'askjsdaddsa', 'match1'], 'done'), (['sajs', 'skasassas', 'asdasdasdasd', 'qwerty'], 'doneagain')]
>>> [(next(x for x in a if len(x) == 6), b) for a, b in l]
[('match1', 'done'), ('qwerty', 'doneagain')]
正如您提到的使用dict,也可以:

>>> l = {'done': ['this', 'askjsdaddsa', 'match1'], 'doneagain': ['sajs', 'skasassas', 'asdasdasdasd', 'qwerty']}
>>> {k: [x for x in v if len(x) == 6] for k, v in l.items()}
{'done': ['match1'], 'doneagain': ['qwerty']}
如果您只想要使用此方法的前6个字母的单词,您可以使用:

>>> l = [(['this', 'askjsdaddsa', 'match1'], 'done'), (['sajs', 'skasassas', 'asdasdasdasd', 'qwerty'], 'doneagain')]
>>> [([x for x in a if len(x) == 6], b) for a, b in l]
[(['match1'], 'done'), (['qwerty'], 'doneagain')]
>>> l = {'done': ['this', 'askjsdaddsa', 'match1'], 'doneagain': ['sajs', 'skasassas', 'asdasdasdasd', 'qwerty']}
>>> {k: next(x for x in v if len(x) == 6) for k, v in l.items()}
{'done': 'match1', 'doneagain': 'qwerty'}

就我个人而言,我更喜欢dict方法,因为它看起来更干净。

您可以使用列表理解-
elem
下面代表列表中的元素

[([i for i in elem_list if len(i) == 6], elem_str) for (elem_list, elem_str) in list_of_tuples]
列表理解的一个简单示例是:


[i代表范围(6)]
,这将创建一个从0到5的列表。函数可以轻松应用,而不仅仅是
i
。这里有一个很好的参考资料。您也可以在字典中使用此语法进行基本的字符串操作。
“”。join()
非常有用

根据您的解释,您的预期输出是否有错误?我想你的意思是:
final\u list\u of tuples=[(['match1'],'done'),(['qwerty'],'doneagain')]
,或者你的意思是假设只有一个六个字母长?如果两个以上的单词正好有六个字符呢?@GarethLatty我不介意它本身是一个项目列表还是一个整数。