如何通过索引访问集合元素?

时间:2018-08-26 15:18:30

标签: python set

当我遇到一个严重的问题时,我正在使用python推荐系统(RS):我无法在不更改其顺序的情况下访问该集合。

例如一旦我更改了要列出的订单集,订单就会更改。 (在建议中,系统顺序非常重要。)

final_prediction=set(df_final)-set(df1)

例如

>>> df_final=['a','x','z','p','s','j','b']
>>> df1=['b','j']
>>> set(df_final)-set(df1)
{'p', 'a', 's', 'z', 'x'}

df_finaldf1都是分类变量

尽管我使用了其他方法,但是我还是不得不刮一下屁股来更改代码,因为使用set方法可以提供完美的结果,而其他所有方法都可以正常工作。我当时处于RS的最后阶段,但是由于设定的顺序,我不得不采用其他方法。

如何在不更改顺序的情况下访问集合?

3 个答案:

答案 0 :(得分:0)

set是无序集合。对于有序集合,可以使用listtuple。您现在有几个选择。您的选择应取决于您是否期望在df_final中重复。如果没有重复,可以使用列表理解:

df1_set = set(df1)
res1 = [i for i in df_final if i not in df1_set]
# ['a', 'x', 'z', 'p', 's']

如果您在df_final中有重复项,则需要保持顺序的唯一项。为此,您可以使用toolz.unique,它等效于the docs中的unique_everseen食谱:

from toolz import unique

res2 = [i for i in unique(df_final) if i not in df1_set]

答案 1 :(得分:0)

列表,第一个已排序

>>> df_final=['a','x','z','p','s','j','b']
>>> df1=['b','j']

这有效,但是它是O(N×M)

>>> [cat_var for cat_var in df_final if cat_var not in df1]
['a', 'x', 'z', 'p', 's']

如果两个列表都很长,则设置成本为O(N)...

>>> sdf1 = set(df1)
>>> [cat_var for cat_var in df_final if cat_var not in sdf1]
['a', 'x', 'z', 'p', 's']

答案 2 :(得分:0)

由于您需要有序集,因此我建议在末尾的“ 另请参见”中使用ActiveState recipe和Python documentation进行推荐。

如果您将食谱的代码放在名为orderedset.py的单独文件中,则可以import作为一个模块并按如下方式使用:

from orderedset import OrderedSet  # See https://code.activestate.com/recipes/576694

df_final = ['a','x','z','p','s','j','b']
df1 = ['b','j']
print(OrderedSet(df_final) - OrderedSet(df1))  # -> OrderedSet(['a', 'x', 'z', 'p', 's'])
相关问题