【问题标题】:Two lists of same length. Get unique pairs based on one of them两个相同长度的列表。根据其中一个获得独特的配对
【发布时间】:2016-08-01 19:20:20
【问题描述】:

我有两个长度相同的列表。比方说:

x = ['123', '456', '789', '123']
y = ['aaa', 'aaa', 'bbb', 'ccc']

它们基本上是组合(123-aaa、456-aaa、789-bbb、123-ccc)。

我想要完成的是获取列表 y 中的唯一值和唯一值的计数,但是只有在我删除了列表 x 中具有相同值的所有对之后。所以在这个例子中,我需要删除 x[3] 和 y[3]。然后在字典中计数:

{'aaa' : '2', 'bbb' : '1'}

我希望这已经足够清楚了。头撞墙好几个小时了……

【问题讨论】:

  • 如果您要删除 x 中具有相同值的对,那不会消除 123: aaa 并导致 {'aaa' : 1, 'bbb' : 1} 吗?

标签: list python-3.x dictionary


【解决方案1】:

检查dictCounter。 dict() 替换重复的值,所以你需要先反转你的列表。

In [24]: x
Out[24]: ['123', '456', '789', '123']

In [25]: y
Out[25]: ['aaa', 'aaa', 'bbb', 'ccc']

In [26]: x.reverse()

In [27]: y.reverse()

In [28]: x
Out[28]: ['123', '789', '456', '123']

In [29]: y
Out[29]: ['ccc', 'bbb', 'aaa', 'aaa']

In [30]: z=dict(zip(x,y))

In [31]: z
Out[31]: {'123': 'aaa', '456': 'aaa', '789': 'bbb'}

In [32]: from collections import Counter

In [33]: values=z.values()

In [34]: values
Out[34]: dict_values(['aaa', 'bbb', 'aaa'])

In [37]: z = Counter(values)

In [38]: z
Out[38]: Counter({'aaa': 2, 'bbb': 1})

In [39]: z['aaa']
Out[39]: 2

In [40]: z['bbb']
Out[40]: 1

In [41]: z.keys()
Out[41]: dict_keys(['bbb', 'aaa'])

如果您可以选择转换为 numpy 数组,请查看unique

In [39]: import numpy as np
In [40]: x = np.array(['123', '456', '789', '123'])

In [41]: y = np.array(['aaa', 'aaa', 'bbb', 'ccc'])

In [42]: x_unique, x_index = np.unique(x, return_index=True)

In [43]: x_unique
Out[43]:
array(['123', '456', '789'],
      dtype='|S3')

In [44]: x_index
Out[44]: array([0, 1, 2])

In [47]: z_unique, z_counts= np.unique(y[x_index],return_counts=True)

In [48]: z_unique
Out[48]:
array(['aaa', 'bbb'],
      dtype='|S3')

In [49]: z_counts
Out[49]: array([2, 1])

In [50]: z = dict(zip(z_unique, z_counts))

In [51]: z
Out[51]: {'aaa': 2, 'bbb': 1}

【讨论】:

    【解决方案2】:

    另一种简单的做法:

    from collections import Counter
    
    x = ['123', '456', '789', '123']
    y = ['aaa', 'aaa', 'bbb', 'ccc']
    
    uniq = []
    res = Counter()
    for number, letter in zip(x, y):
        if number not in uniq:
            uniq.append(number)
            res.update(letter)
    
    print dict(res)
    

    {'aaa': 2, 'bbb': 1}

    【讨论】:

    • 非常感谢 - 如此简单...我唯一需要更改的是将字母放在 [] 中,因为我的实际列表包含单词而不是字母,如果您按原样运行脚本,它会得到识别为字母序列,而不是单词。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2023-01-22
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    相关资源
    最近更新 更多