删除元组列表中的项目

时间:2018-06-22 01:54:31

标签: python python-3.x list tuples

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

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)

我感觉好像有些基本的东西正在吹过去。有没有一种方法可以做到这一点?输出到字典会更容易吗?

3 个答案:

答案 0 :(得分:3)

与大多数涉及在Python中更改列表的任务一样,此处的工作工具可能是list comprehension,在本例中为其中两个:

>>> [([word for word in words if len(word) == 6], key) for (words, key) in list_of_tuples]
[(['match1'], 'done'), (['qwerty'], 'doneagain')]

内部理解[word for word in words if len(word) == 6]很清楚-可以将列表筛选为长度为6的单词。外部的只是将内部的应用于每个元组的第一个元素,并重建该元组。

当然,如果直接使用值,则无需构造新列表,则可以正常进行迭代:

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

答案 1 :(得分:2)

如果要在这些列表上支持多个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')]

您还可以获取字符串列表中的前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')]

正如您在使用字典中提到的那样,这也是可能的:

>>> 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 = {'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方法,因为它看起来更干净。

答案 2 :(得分:1)

您可以使用列表推导-elem代表列表元素。

[([i for i in elem_list if len(i) == 6], elem_str) for (elem_list, elem_str) in list_of_tuples]

一个简单的列表理解示例是:

[i for i in range(6)],这将创建一个从0到5的列表。可以轻松应用功能,而不仅仅是i。这是一个很好的参考。您也可以在字典中使用此语法,因为基本的字符串操作''.join()很有用。 Explanation of how list comprehension works?