我有一个列表列表,所以是一个二维数组。我试图使用in
来确定字符串是否在这些数组中。因此,我没有使用if word in wordlist:
,而是使用:
for i in range(len(wordlist)):
if word in wordlist[i]:
wordlist[i][2] += 1 #this accounts for the frequency of a word in a file
if (i + 1 == len(wordlist) and word !=wordlist[len(wordlist)-1]):
wordlist.append([word,linenum,1])
有更优雅的方式吗?
编辑:
示例wordlist
:
[['civilizati', 1, 1], ['of', 1, 1], ['science', 2, 1], ['is', 2, 1], ['knowledge', 3, 1], ['is', 3, 1]]
修改编辑:
我认为我的问题并不清楚。如果我使用的是1d列表,我可以这样做:
if(word in wordlist1d):
print("It's here")
else:
wordlist1d.append(word)
这比我的for
循环怪物要优雅得多。但是,由于wordlist不是1d,所以wordlist中的语句单词永远不会返回true,即使word在wordlist的子列表中也是如此。我想知道是否有比使用for
循环更优雅的方式。
答案 0 :(得分:4)
不是使用索引指针并使用它来迭代列表,而是直接迭代列表:
for item in wordlist:
if word in item:
....
只是为了证明他们是完全相同的:
In [2]: for item in wordlist:
...: print item
...:
['civilizati', 1, 1]
['of', 1, 1]
['science', 2, 1]
['is', 2, 1]
['knowledge', 3, 1]
['is', 3, 1]
In [3]: for i in range(len(wordlist)):
...: print wordlist[i]
...:
['civilizati', 1, 1]
['of', 1, 1]
['science', 2, 1]
['is', 2, 1]
['knowledge', 3, 1]
['is', 3, 1]
您想要的 - 现在您提供的数据格式 - 是
for item in wordlist:
if word == item[0]:
item[2] += 1
答案 1 :(得分:2)
最好使用dict
将单词作为键,并将[linenum, count]
对作为值。您的整个功能变得简单:
wordlist.setdefault(word, [linenum, 0])[1] += 1
如果你必须把它变成一个列表,你可以这样做:
[[k] + v for k, v in wordlist.items()]
答案 2 :(得分:2)
我建议使用else
子句进行循环:
for sublist in wordlist:
if word == sublist[0]: # compare directly with the relevant part of the sublist
sublist[2] += 1
break # we only will match at most once, so break after finding one
else: # this clause is run if no break was hit
wordlist.append([word, linenum, 1])
更有效的方法可能是使用从单词到lineno, count
子列表的字典映射。搜索字典为O(1)
,而不是O(n)
来搜索您的列表列表。为了使代码适用于未找到的单词,您可以使用setdefault
方法:
d = {}
for word, lineno in document:
d.setdefault(word, [lineno, 0])[1] += 1 # works whether or not word was in d before
答案 3 :(得分:1)
如果您要查找文件中的字数,可以执行以下操作:
from collections import Counter
wordlist = Counter(myfile.read().split())
如果你想获得文件中的所有单词,你可以这样做:
wordlist.keys()
如果你想得到一些主要词:
wordlist['myword']