当前位置: 首页 > 面试题库 >

如何分解元组列表?

尹凌龙
2023-03-14
问题内容

定义
分解:将每个唯一对象映射为唯一整数。通常,映射到的整数范围是从零到n-1,其中n是唯一对象的数量。同样有两种变体。类型1是按标识唯一对象的顺序进行编号的位置。在类型2中,首先对唯一对象进行排序,然后应用与类型1中相同的过程。

html" target="_blank">安装程序
考虑元组列表tups

tups = [(1, 2), ('a', 'b'), (3, 4), ('c', 5), (6, 'd'), ('a', 'b'), (3, 4)]

我想将其分解为

[0, 1, 2, 3, 4, 1, 2]

我知道有很多方法可以做到这一点。但是,我想尽可能有效地做到这一点。

我尝试过的

pandas.factorize 并得到一个错误…

pd.factorize(tups)[0]

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-84-c84947ac948c> in <module>()
----> 1 pd.factorize(tups)[0]

//anaconda/envs/3.6/lib/python3.6/site-packages/pandas/core/algorithms.py in factorize(values, sort, order, na_sentinel, size_hint)
    553     uniques = vec_klass()
    554     check_nulls = not is_integer_dtype(original)
--> 555     labels = table.get_labels(values, uniques, 0, na_sentinel, check_nulls)
    556 
    557     labels = _ensure_platform_int(labels)

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_labels (pandas/_libs/hashtable.c:21804)()

ValueError: Buffer has wrong number of dimensions (expected 1, got 2)

或numpy.unique得到不正确的结果…

np.unique(tups, return_inverse=1)[1]

array([0, 1, 6, 7, 2, 3, 8, 4, 5, 9, 6, 7, 2, 3])

我可以在元组的哈希值中使用其中任何一个

pd.factorize([hash(t) for t in tups])[0]

array([0, 1, 2, 3, 4, 1, 2])

好极了!那就是我想要的…那是什么问题呢?

第一个问题
看一下这种技术的性能下降

lst = [10, 7, 4, 33, 1005, 7, 4]

%timeit pd.factorize(lst * 1000)[0]
1000 loops, best of 3: 506 µs per loop

%timeit pd.factorize([hash(i) for i in lst * 1000])[0]
1000 loops, best of 3: 937 µs per loop

第二个问题
哈希不能保证唯一!

问题
分解元组列表的超快速方法是什么?

在此处输入图片说明

code

from itertools import count

def champ(tups):
    d = {}
    c = count()
    return np.array(
        [d[tup] if tup in d else d.setdefault(tup, next(c)) for tup in tups]
    )

def root(tups):
    return pd.Series(tups).factorize()[0]

def iobe(tups):
    return np.unique(tups, return_inverse=True, axis=0)[1]

def get_row_view(a):
    void_dt = np.dtype((np.void, a.dtype.itemsize * np.prod(a.shape[1:])))
    a = np.ascontiguousarray(a)
    return a.reshape(a.shape[0], -1).view(void_dt).ravel()

def diva(tups):
    return np.unique(get_row_view(np.array(tups)), return_inverse=1)[1]

def gdib(tups):
    return pd.factorize([str(t) for t in tups])[0]

from string import ascii_letters

def tups_creator_1(size, len_of_str=3, num_ints_to_choose_from=1000, seed=None):
    c = len_of_str
    n = num_ints_to_choose_from
    np.random.seed(seed)
    d = pd.DataFrame(np.random.choice(list(ascii_letters), (size, c))).sum(1).tolist()
    i = np.random.randint(n, size=size)
    return list(zip(d, i))

results = pd.DataFrame(
    index=pd.Index([100, 1000, 5000, 10000, 20000, 30000, 40000, 50000], name='Size'),
    columns=pd.Index('champ root iobe diva gdib'.split(), name='Method')
)

for i in results.index:
    tups = tups_creator_1(i, max(1, int(np.log10(i))), max(10, i // 10))
    for j in results.columns:
        stmt = '{}(tups)'.format(j)
        setup = 'from __main__ import {}, tups'.format(j)
        results.set_value(i, j, timeit(stmt, setup, number=100) / 100)

results.plot(title="Avg Seconds", logx=True, logy=True)

问题答案:

将元组列表初始化为Series,然后调用factorize:

pd.Series(tups).factorize()[0]

[0 1 2 3 4 1 2]


 类似资料:
  • 问题内容: 我有一个这样的(标签,计数)元组列表: 由此,我想对所有具有相同标签的值求和(相同的标签始终相邻),并以相同的标签顺序返回列表: 我知道我可以用以下方法解决它: 但是,有没有更Pythonic /优雅/有效的方法来做到这一点? 问题答案: 可以做你想做的:

  • 我有一个列表(原始列表)类型MyType的元素。我的类型是: 因此,我想在列表中单独列出每组元素,其中每组元素都具有相同的IDRISULECEElement。 例如,一个列表列表,主列表的每个列表只包含同一组的元素。 例如,我有一个包含以下元素的原始列表: 项目1(1,1,1); 项目2(1,2,2); 项目3(1,3,3); 项目4(2,4,4); 项目5(2,5,5); 项目6(2,6,6);

  • 问题内容: 我有一个元组元组-例如: 我想按顺序将其转换为所有元素的平面一维列表: 我一直在尝试通过列表理解来实现。但我似乎无法弄清楚。我能够通过for-each循环来完成它: 但是我觉得必须有一种方法来理解列表。 一个简单的只是给您一个列表列表,而不是单个元素。我以为可以通过使用拆包运算符然后将列表拆包来建立此基础,如下所示: 要么 …但是那没用。有任何想法吗?还是我应该坚持下去? 问题答案:

  • 本文向大家介绍Python分组的元组列表求和,包括了Python分组的元组列表求和的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将编写一个程序,该程序将具有相同键的所有值添加到不同列表中。让我们看一个例子来清楚地理解它。 输入值 输出结果 请按照给定的步骤解决问题。 初始化列表。 使用dict将第一个列表转换为字典并将其存储在变量中。 遍历第二个列表,并将相应的值添加到字典中存在的键中

  • 问题内容: 我是Python的新手,需要将列表转换为字典。我知道我们可以将元组列表转换为字典。 这是输入列表: 并且我想将此列表转换为元组列表(或直接转换为字典),如下所示: 我们如何在Python中轻松做到这一点? 问题答案: 您想一次将三个项目分组吗? 您想一次分组N个项目吗?