Python:如何从包含重复项的列表中返回计数值不同的项列表?

时间:2018-10-02 17:07:59

标签: python list loops dictionary nested-lists

我有嵌套在列表中的列表。这是我尝试使用列表的迷你预览来绘制单个嵌套列表的数量的代码:

(['a', 'b'], 2)
(['a', 'b'], 2)
(['c'], 2)
(['c'], 2)
(['d', 'e'], 1)
(['e'], 1)

我试图使输出成为仅包含不同嵌套列表及其计数的字典/列表,以便我可以按计数对结果进行排序。列表不使用两个值,因此我正在考虑将其设为字典以便更轻松地存储。 这些是我从上面的代码中得到的结果。

$myObj = new stdClass();

$myObj->requestTime = $reqtime;
$myObj->clients[] = ['id' => $id, 'name' => $name];

$myJSON = json_encode($myObj);

echo $myJSON;

我希望输出为每个不同的列表及其相应的计数仅提供一行(而不是如上面的当前输出所示,为同一列表提供多行)。有什么想法吗?

4 个答案:

答案 0 :(得分:4)

您应该使用collections.Counter()

>>> count_list = [['a', 'b'],['d', 'e'], ['e'], ['c'], ['a', 'b'], ['c']]
>>> import collections
>>> result = collections.Counter(tuple(x) for x in count_list)
>>> print(result)
Counter({
    ('c',): 2,
    ('a', 'b'): 2,
    ('d', 'e'): 1,
    ('e',): 1
})

答案 1 :(得分:2)

即使TreeView是python原生的,如果您不想使用任何库,也可以...

Counter

答案 2 :(得分:1)

如果可以将嵌套列表转换为元组,以便将它们用作键,则将结果作为dict(与如何解决此问题的最初想法相一致)也将非常简单。例如:

Completable.fromAction(new Action() {
    @Override
    public void run() throws Exception {
        getRoomDatabase().clearAllTables();
    }
}).subscribeOn(getSchedulerProvider().io())
        .observeOn(getSchedulerProvider().ui())
        .subscribe(new Action() {
            @Override
            public void run() throws Exception {
                Log.d(TAG, "--- clearAllTables(): run() ---");
                getInteractor().setUserAsLoggedOut();
                getMvpView().openLoginActivity();
            }
        }, new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                Log.d(TAG, "--- clearAllTables(): accept(Throwable throwable) ----");
                Log.d(TAG, "throwable.getMessage(): "+throwable.getMessage());


            }
        });

答案 3 :(得分:1)

如果您转换为元组,则可以使用字典理解

count_list = [tuple(i) for i in count_list]

d = {i: count_list.count(i) for i in set(count_list)}
{('a', 'b'): 2, ('d', 'e'): 1, ('c',): 2, ('e',): 1}