我有以下列表列表:
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']在输出中不期望。
在遇到某些项目时,我不必拆分列表。
我经历了很多代码,这些代码根据条件对列表进行了拆分,但是我的问题在这里有所不同。因此,这不是一个重复的问题。
我不知道开始编码的最初方法。
答案 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中的列表或其他可迭代项,则应该熟悉它。