删除重复项后如何维护字符串列表索引?

时间:2018-11-28 07:17:54

标签: python python-3.x set list-comprehension

我有一个包含字符串的 public ActionResult Login(string returnUrl) { try { UserName= HttpContext.User.Identity.Name; // . . . . }。这些字符串不一样。但是,在我这样做之后

list

alist = ['string1','string2'] #list of string processed_alist = [some_function(s) for s in alist] #processing strings 中有一些重复项,我想将其删除。如果我愿意

processed_alist

所有字符串索引都必须加扰,并且我无法检查processed_alist = list(set(processed_alist)) 中的哪个字符串与alist中的字符串匹配。

有什么方法可以维护processed_alist中的字符串索引,但是我仍然可以删除重复的字符串?

例如,

我有

processed_alist

alist = ['sta','tsb','sat','tsa','tsd','stb'] 返回删除了字符some_function(s)的字符串。因此,s应该是

processed_alist

在删除重复项后变为

['ta','tb','at','ta','td','tb']

我想删除['ta','tb','at','td'] 中的重复项,但同时我想获取已处理字符串的原始字符串。假设函数名称为processed_alist。所以,如果我写

get_original

2 个答案:

答案 0 :(得分:1)

最简单的方法是使用OrderedDict

>>> from collections import OrderedDict
>>> processed_alist = ['not a dupe', 'still not a dupe', 'i am dupe!', 'i am dupe!', 'err not a dupe']
>>> list(OrderedDict.fromkeys(processed_alist))
['not a dupe', 'still not a dupe', 'i am dupe!', 'err not a dupe']

答案 1 :(得分:0)

Python 3.6+字典中的字典保存顺序。您可以在删除重复项时使用dict.fromkeys()保留顺序:

result = dict().fromkeys(map(some_function, alist)).keys()

请注意,结果是一个key对象,如果您一定要一个列表(如果只想要一个可迭代的对象,则不是一个好主意),则应改为执行以下操作:

result = list(dict().fromkeys(map(some_function, alist)))

此外,如果您使用的是Python-3.6-,则应考虑使用collections.OrderedDict(),它的功能相同,但性能略有不同。

关于下一部分map(some_function, alist),如果some_function不是内置函数,则最好使用列表推导,以防您确实需要尽可能快的代码。这样做的原因是因为map是一个内置函数,并且与同类函数(链式规则)完美配合使用。

根据您的更新,您可以只使用str.replace()而不是函数和带有dict.fromkeys()的生成器表达式:

In [48]: dict().fromkeys(i.replace('s', '') for i in alist).keys()
Out[48]: dict_keys(['ta', 'tb', 'at', 'td'])

请注意,您也可以使用{}来构造一个空字典,这比直接调用dict类型要快一些。

In [49]: %timeit dict().fromkeys(i.replace('s', '') for i in alist).keys()

1.75 µs ± 3.35 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [50]: %timeit {}.fromkeys(i.replace('s', '') for i in alist).keys()
1.67 µs ± 10.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)