sha*_*pan 4 python sorting list set sequence
In [1]: l1 = ['a',2,3,0,9.0,0,2,6,'b','a']
In [2]: l2 = list(set(l1))
In [3]: l2
Out[3]: ['a', 0, 2, 3, 6, 9.0, 'b']
Run Code Online (Sandbox Code Playgroud)
在这里你可以看到列表l2正在以不同的顺序落入原始的l1,我需要从列表中删除重复的元素而不改变列表元素的顺序/顺序....
Joh*_*ooy 11
如果你不关心效率,那就是O(n*m)
>>> sorted(set(l1), key=l1.index)
['a', 2, 3, 0, 9.0, 6, 'b']
Run Code Online (Sandbox Code Playgroud)
使用中间字典更复杂,但是是O(n + m*logm)
其中n是l1中元素的数量,m是l1中唯一元素的数量
>>> l1 = ['a',2,3,0,9.0,0,2,6,'b','a']
>>> d1=dict((k,v) for v,k in enumerate(reversed(l1)))
>>> sorted(d1, key=d1.get, reverse=True)
['a', 2, 3, 0, 9.0, 6, 'b']
Run Code Online (Sandbox Code Playgroud)
在Python3.1中你有OrderedDict所以它很容易
>>> l1 = ['a',2,3,0,9.0,0,2,6,'b','a']
>>> list(OrderedDict.fromkeys(l1))
['a', 2, 3, 0, 9.0, 6, 'b']
Run Code Online (Sandbox Code Playgroud)
您可以通过定义这样的函数来解决它:
def dedupe(items):
seen = set()
for item in items:
if item not in seen:
yield item
seen.add(item)
Run Code Online (Sandbox Code Playgroud)
要使用它:
>>> l1 = ['a',2,3,0,9.0,0,2,6,'b','a']
>>> l2 = list(dedupe(l1))
>>> l2
['a', 2, 3, 0, 9.0, 6, 'b']
Run Code Online (Sandbox Code Playgroud)
这是我的想法(使用字典):
l1 = ['a',2,3,0,9.0,0,2,6,'b','a']
l2 = []
s = {}
for i in l1:
if not i in s:
l2.append(i)
s[i] = None
# l2 contains ['a', 2, 3, 0, 9.0, 6, 'b', 'a']
Run Code Online (Sandbox Code Playgroud)
编辑:使用集合(也在我的脑海中):
l1 = ['a',2,3,0,9.0,0,2,6,'b','a']
l2 = []
s = set()
for i in l1:
if not i in s:
l2.append(i)
s.add(i)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9700 次 |
| 最近记录: |