基于其他列表列表对列表列表中的项目进行分组

时间:2018-11-13 14:53:46

标签: python arrays python-3.x list nested-lists

我有以下列表列表:

mylist = [['NNP', 'NN', 'VBZ', 'VBN', 'NNP', 'NNP'],
           ['VB', 'VBN'],
           ['NNP'],
           ['VB', 'NN'],
           ['NN', 'NN']]

我还有一个列表清单:

cond = [['NNP', 'NN'], ['VBZ', 'VBN', 'VB']]

我想基于cond列表中的列表将mylist中的列表项列表分组,并获得以下输出。

out = [['NNP', 'NN'], ['VBZ', 'VBN'], ['NNP', 'NNP'], ['VB', 'VBN'], ['NNP'], ['VB'], ['NN'], ['NN', 'NN']]

项目的分组方式应使mylist中的列表项目列表仅是cond中一个列表的一部分,即['NN','VBZ']或['VBN','NNP']在输出中不期望。

在遇到某些项目时,我不必拆分列表。

我经历了很多代码,这些代码根据条件对列表进行了拆分,但是我的问题在这里有所不同。因此,这不是一个重复的问题。

我不知道开始编码的最初方法。

1 个答案:

答案 0 :(得分:1)

这是我想出的最好的方法:

    <dependency>
        <groupId>com.auth0</groupId>
        <artifactId>java-jwt</artifactId>
        <version>3.4.1</version>
    </dependency>

首先,我们遍历所有子列表。然后,我们使用 import com.auth0.jwt.JWT; import com.auth0.jwt.JWTVerifier; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.exceptions.JWTDecodeException; import com.auth0.jwt.interfaces.DecodedJWT; import java.math.BigInteger; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.PublicKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.RSAPublicKeySpec; import org.apache.commons.codec.binary.Base64; 方法takewhile来构造一个与import itertools mylist = [['NNP', 'NN', 'VBZ', 'VBN', 'NNP', 'NNP'], ['VB', 'VBN'], ['NNP'], ['VB', 'NN'], ['NN', 'NN']] cond = [['NNP', 'NN'], ['VBZ', 'VBN', 'VB']] out = list() for sublist in mylist: while sublist != []: match = list(filter(lambda x: x != [], [list(itertools.takewhile(lambda x: x in condition, sublist)) for condition in cond]))[0] out.append(match) sublist = sublist[len(match):] print(out) 中的任何条件匹配的元素列表。有时,给定的itertools不会有匹配的元素集,因此我们会过滤掉cond的结果。然后,我们从列表的开头删除该数量的元素。我们将构造的列表添加到最终列表中。然后,我们再次进行condition处理,直到[]用尽为止。我们对takewhile中的每个子列表重复整个过程。

itertools是python中一个非常强大的库,如果您经常使用python中的列表或其他可迭代项,则应该熟悉它。