&引用;索引“;属性-Python

&引用;索引“;属性-Python,python,indexing,Python,Indexing,当我阅读这个关于从字符串中删除重复项的问题的答案时,我不明白索引属性在 ''.join(sorted(set(foo), key=foo.index)) 我运行了以下示例: foo = "Wicked long string" >>> "".join(sorted(set(foo),key = foo.index)) 'Wicked longstr' >>> "".join(sorted(set(foo))) ' Wcdegiklnorst' 这让我觉得

当我阅读这个关于从字符串中删除重复项的问题的答案时,我不明白
索引
属性在

''.join(sorted(set(foo), key=foo.index)) 
我运行了以下示例:

foo = "Wicked long string"
>>> "".join(sorted(set(foo),key = foo.index))
'Wicked longstr'
>>> "".join(sorted(set(foo)))
' Wcdegiklnorst'

这让我觉得它有助于保持字符的顺序。

索引是一种用于大多数有序序列的方法,用于查找该序列中某个元素的第一次出现。例如,
“我的字符串在这里。”。索引(“”
将返回
2
,因为
的第一次出现在位置
2
。它用于字符串、元组、列表等。上的文档有更多关于它的信息。

正如其他Pythons
sorted()
函数所提到的,列表的
sort()
方法提供了
参数,用于在进行比较之前指定要在每个列表元素上调用的函数

关键是这个
key
参数是一个函数对象,当它只被调用一个参数时,它会接受,并返回一个用于排序的值

匿名通常用于此目的,因为其定义不包括
return
语句,因此始终包含一个返回的表达式

比如说

>>> myKey = lambda e: id(e)
创建(匿名)函数对象


为了解决您的问题,您可以创建一个lambda函数作为
key
,它接受一个元素并在
foo
字符串中返回其索引,以保持字符的顺序:

>>> foo = "Wicked long string"
>>> "".join(sorted(set(foo), key = lambda e: foo.index(e)))
'Wicked longstr'
另一方面,由于
foo.index
本身是一个函数对象,它接受一个参数并返回一个值,因此可以将此对象传递给
sorted()
函数,并通过lambda定义:

>>> "".join(sorted(set(foo),key = foo.index))
'Wicked longstr'

希望这有帮助:)

好的。。。那么你的问题是什么呢?所有序列都支持
.index
方法,请参见此部分使用原始列表索引对
集合
(无序)进行排序。因此,您将获得与原始列表相同的顺序。如果没有
,它只会按词汇对字符进行排序。@CoryKramer,我不知道
.index
是什么,因为它与
无关。index(sub[,start[,end]])
,是吗?@AChampion,因此,如果我在foo:print I.index中为I运行
>>,它将返回每个列表元素的原始索引?我理解索引在有参数时的用法。我似乎不明白的是,当它被用作一个属性时,方法不是特殊的属性,仅仅因为它们是方法;它们是可以像其他任何东西一样移动和引用的属性。
sorted
函数有自己的排序方式,但您也可以指定一个键。该键是一个函数,当给定一个值时,它返回一个特定的数字,
sorted
将使用该数字将该值放入其列表中。在这种情况下,每个元素的值都是它在
foo
中的索引。这样,所有相等的元素都将具有相同的排序值,因此将彼此相邻排序。@tulians该属性只是一个变量,用于存储对该函数的引用,您可以像其他任何东西一样使用该函数。试试这个:
x='hello'。索引
然后像调用
x('o')
x('e')
x('y')
>>> foo = "Wicked long string"
>>> "".join(sorted(set(foo), key = lambda e: foo.index(e)))
'Wicked longstr'
>>> "".join(sorted(set(foo),key = foo.index))
'Wicked longstr'