【问题标题】:Remove subset of an element from a list if there are more than one如果有多个元素,则从列表中删除元素的子集
【发布时间】:2017-11-27 16:12:43
【问题描述】:

如果我有这样的列表:

[u'test_1', u'test_2', u'test_3', u'bananas_4', u'cake_5', u'bananas_6']

在事先不知道其他任何事情的情况下获得以下内容的最佳方法是什么?

[u'test_1', u'bananas_4', u'cake_5']

所以我怎么看,就像循环列表一样,以某种方式存储testbananas,如果在另一个迭代中,看到另一个相同的字符串开头,从列表中删除它.

有人知道实现这一目标的最佳方法吗?

【问题讨论】:

  • 你能澄清你的问题吗?您是否只查找列表中具有公共子字符串的第一个字符串?或者也许是按最后的数字排序?您是否只查找以“test_”、“bananas_”或“cake_”开头的第一个单词?
  • @Ben 我在找[u'test_1', u'bananas_4', u'cake_5'](虽然数字并不重要)如果这样有意义吗?
  • @Rekovni-您正试图在某些条件下从您的大列表中创建一个较小的列表。您的示例不足以让我猜出您要查找的条件
  • @Ben 条件是下划线前面的所有内容,因此从列表中删除所有重复的testbananas。下划线之后的所有内容都无关紧要。

标签: python python-2.7 list set


【解决方案1】:

我的主要想法是使用默认情况下不覆盖项目的字典功能。

我使用OrderedDict 来保持项目的插入顺序。

lst = [u'test_1', u'test_2', u'test_3', u'bananas_4', u'cake_5', u'bananas_6']
d = OrderedDict()
for item in lst:
    key, val = item.split('_')
    d.setdefault(key, val) # will not override if item was there before

new_list = [key + '_' + val for key,val in d.items()]
print new_list

输出是

[u'test_1', u'bananas_4', u'cake_5']

【讨论】:

    【解决方案2】:

    只需保留一组前缀,如果它们不在前缀列表中,则仅将项目添加到过滤列表中:

    start = [u'test_1', u'test_2', u'test_3', u'bananas_4', u'cake_5', u'bananas_6']
    
    seen = set()
    end = []
    
    for item in start:
        prefix = item.partition('_')[0]
        if prefix not in seen:
            end.append(item)
            seen.add(prefix)
    
    print(end)  # ['test_1', 'bananas_4', 'cake_5']
    

    【讨论】:

      【解决方案3】:

      我会把它分成两个部分。第一个是用“_”分割列表中的字符串,然后你会得到原始信息 [test,test,test,banana,cake,banana] 和另一个带有数字 [1,2,3,4,5, 6]

      然后您可以使用以下解决方案找到字符串列表的唯一性: Get unique values from a list in python。最后重新添加数字。

      【讨论】:

        猜你喜欢
        • 2021-07-21
        • 2020-06-17
        • 1970-01-01
        • 2010-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-12
        相关资源
        最近更新 更多