是否有内置功能可以从Python中的列表中删除重复项,同时保留顺序?我知道我可以使用一个集来删除重复项,但这会破坏原始顺序.我也知道我可以像这样滚动自己:
def uniq(input):
output = []
for x in input:
if x not in output:
output.append(x)
return output
Run Code Online (Sandbox Code Playgroud)
但是如果可能的话,我想利用内置或更多的Pythonic习语.
想想我正在调用它的副作用的函数,而不是返回值(比如打印到屏幕,更新GUI,打印到文件等).
def fun_with_side_effects(x):
...side effects...
return y
Run Code Online (Sandbox Code Playgroud)
现在,是Pythonic使用列表推导来调用这个函数:
[fun_with_side_effects(x) for x in y if (...conditions...)]
Run Code Online (Sandbox Code Playgroud)
请注意,我不会将列表保存在任何位置
或者我应该像这样调用这个函数:
for x in y:
if (...conditions...):
fun_with_side_effects(x)
Run Code Online (Sandbox Code Playgroud)
哪个更好?为什么?
有一个列表L.它包含每个任意类型的元素.如何有效删除此列表中的所有重复元素?必须保留ORDER
只需要一个算法,因此不允许导入任何外部库.
我有一个父子连接数据库.数据看起来如下所示,但可以以您想要的任何方式呈现(字典,列表,JSON等).
links=(("Tom","Dick"),("Dick","Harry"),("Tom","Larry"),("Bob","Leroy"),("Bob","Earl"))
Run Code Online (Sandbox Code Playgroud)
我需要的输出是一个分层的JSON树,它将用d3渲染.数据中有离散的子树,我将附加到根节点.所以我需要递归地遍历链接,并构建树结构.我能得到的最远的是遍历所有人并追加他们的孩子,但我无法想出更高阶的链接(例如如何将带孩子的人附加到其他人的孩子身上).这与此处的另一个问题类似,但我无法事先知道根节点,因此我无法实现已接受的解决方案.
我将从我的示例数据中获取以下树结构.
{
"name":"Root",
"children":[
{
"name":"Tom",
"children":[
{
"name":"Dick",
"children":[
{"name":"Harry"}
]
},
{
"name":"Larry"}
]
},
{
"name":"Bob",
"children":[
{
"name":"Leroy"
},
{
"name":"Earl"
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
这个结构在我的d3布局中呈现如下. 
我想从嵌套列表中提取唯一数据,请参见下文。我实现了两种方式。第一个效果很好,但第二个失败了。new_data计算时是否为空?我该如何解决它?
data = [
['a', 'b'],
['a', 'c'],
['a', 'b'],
['b', 'a']
]
# working
new_data = []
for d in data:
if d not in new_data:
new_data.append(d)
print(new_data)
# [['a', 'b'], ['a','c'], ['b','a']]
# Failed to extract unique list
new_data = []
new_data = [d for d in data if d not in new_data]
print(new_data)
# [['a', 'b'], ['a', 'c'], ['a', 'b'], ['b', 'a']]
Run Code Online (Sandbox Code Playgroud) 这个想法刚刚出现在我的脑海中。假设您出于某种原因想要通过 Python 中的列表理解来获取列表的唯一元素。
[i if i in {created_comprehension} else 0 for i in [1, 2, 1, 2, 3]
[1, 2, 0, 0, 3]
我不知道,我确实没有这样做的目的,但如果可以在创建时引用理解,那就太酷了。
(例如,如何使用列表理解从列表中删除重复的项目?是一个类似的问题)