Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除重复后如何维护字符串列表的索引?_Python_Python 3.x_Set_List Comprehension - Fatal编程技术网

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

Python 删除重复后如何维护字符串列表的索引?,python,python-3.x,set,list-comprehension,Python,Python 3.x,Set,List Comprehension,我有一个包含字符串的列表。那些字符串不一样。但是,在我这样做之后 alist = ['string1','string2'] #list of string processed_alist = [some_function(s) for s in alist] #processing strings 已处理列表中存在一些重复项,我想删除它们。如果我这样做 processed_alist = list(set(processed_alist)) 所有字符串索引都必须加扰,我无法检查alist中

我有一个包含字符串的
列表
。那些字符串不一样。但是,在我这样做之后

alist = ['string1','string2'] #list of string
processed_alist = [some_function(s) for s in alist] #processing strings
已处理列表
中存在一些重复项,我想删除它们。如果我这样做

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

有没有办法在
processed\u list
中维护字符串索引,但我仍然可以删除重复的字符串

比如说,

我有

alist = ['sta','tsb','sat','tsa','tsd','stb']
某些函数
返回已删除字符
s
的字符串。因此,
处理列表

['ta','tb','at','ta','td','tb']
并在消除重复后成为

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

get_original(processed_alist[3])
#return 'tsd' because original string from 'td' is 'tsd'
get_original(processed_alist[0])
#return 'sta' or 'tsa'. I don't mind which one

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

result = dict().fromkeys(map(some_function, alist)).keys()
请注意,结果是一个
对象,如果您一定想要一个列表(如果您只是想要一个iterable,这不是一个好主意),您应该执行以下操作:

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

同样,如果你使用Python 3.6-你应该考虑使用<代码>集合.OrrordEdId()。 关于以下部分

map(some_函数,alist)
如果
some_函数
不是内置函数,您最好使用列表理解,以防您确实需要尽可能快地编写代码。之所以这样做,是因为
map
是一个内置函数,与同类函数(链式规则)配合使用效果更好

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

请注意,您也可以使用
{}
来构造空字典,这也比直接调用
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)

最简单的方法是使用
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']

注意:这仅适用于CPython for 3.6。对于3.7,所有的实现都应该支持这一点。我希望我的问题更清楚。你基本上改变了问题的性质。。。我可能需要做一个单独的回答。
>>> 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']