我有一个包含字符串的 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
答案 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)