我是python的新手,因此对于这个问题可能很愚蠢,我感到抱歉。我有一个看起来像这样的列表列表:
a = [['P - tag1', 'A - tag2', 'P - tag2', ' B - tag1', 'P - tag3'],['A - tag2', 'B - tag1'],['P - tag2', 'B - tag1','P - tag 3]]
我想做的是计算具有至少一个包含字符串'P-'的元素的列表数。在此示例中,答案为2。
然后,我还要计算包含n个包含'P-'字符串的元素的列表。假设我想知道有2个“ P-”元素(给定示例中为1个)的列表。实现这一目标的最简单,最有效的方法是什么?
答案 0 :(得分:1)
这将执行此操作,其列表理解将检查子列表是否至少包含包含n
的{{1}}个元素:
P -
您只需更改 n = 1
len([i for i in a if len([j for j in i if 'P -' in j])>=n])
来指定下限。
答案 1 :(得分:1)
我已经在这里看到了一些不错的答案,但是,这也是为什么这些方法起作用的说明。
让我们分解这个问题,首先让我们看一下如何查看字符串是否包含P -
:
string_a = 'P - tag1'
string_b = 'A - tag2'
'P -' in string_a # yields True
'P -' in string_b # yields False
现在,我们检查列表中的任何项目是否包含P -
中的item
为True的项目。我们通过列表理解遍历一个列表:
lst = ['P - tag1', 'A - tag2', 'P - tag2', ' B - tag1', 'P - tag3']
any(['P -' in item for item in lst]) # Yields True because there are items containing 'P -'
接下来,我们将其应用于所有嵌套列表,并使用sum()
sum(any(['P -' in item for item in lst]) for lst in a)
答案 2 :(得分:0)
我已经编写了可以正常工作的代码。它循环列表,然后循环遍历子列表中的项目。如果在项目中找到p -
,则它总共加1并立即中断该循环(因为列表中需要一个P -
标签)并继续到下一个子列表。
a = [['P - tag1', 'A - tag2', 'P - tag2', ' B - tag1', 'P - tag3'],['A - tag2', 'B - tag1'],['P - tag2', 'B - tag1','P - tag 3']]
contains = 0
for aa in a:
for aaa in aa:
if "P -" in aaa:
contains += 1
break
print(contains)
答案 3 :(得分:0)
定义一个辅助函数,以计算列表中具有P
的元素
def countP(lst):
return sum(1 for item in lst if 'P-' in item)
,然后假设my_list
是您的初始列表,而n
是您的阈值
result= sum(1 for sublist in my_list if countP(sublist) > n)
答案 4 :(得分:0)
只需在内部列表中查找模式'P -tag'
即可转换为字符串,而无需遍历整个内部列表。
sum([1 for i in a if 'P - tag' in ''.join(i)])
答案 5 :(得分:0)
听起来您想按 <android.support.constraint.Placeholder
android:id="@+id/template_dialog_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
tools:text="asasdasdasdasdasdasdasdasdasdasdf"
app:content="@+id/dialog_content"
app:layout_constraintBottom_toTopOf="@+id/w_buttons"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/dialog_title" />
的出现将列表中的列表分组:
'P -'
>>> a = [['P - tag1', 'A - tag2', 'P - tag2', ' B - tag1', 'P - tag3'],['A - tag2', 'B - tag1'],['P - tag2', 'B - tag1','P - tag 3']]
>>> res = [(f'list{i}', sum(1 for j in l if 'P -' in j)) for i,l in enumerate(a, start=1)]
>>> res
[('list1', 3), ('list2', 0), ('list3', 2)]
>>> sum(1 for i in res if i[1] > 0)
2
包含每个列表出现的次数,总和2是对至少包含1个出现次数的所有列表进行计数的结果。计算所有列表中的所有事件将是res
。
答案 6 :(得分:0)
sum(x > 0 for x in [sum([1 for s in i if s.startswith("P -")]) for i in a])
将x> 0更改为x> i,以计算其他发生率。
这是如何工作的?
[1 for s in i if s.startswith("P -")]
对于以P开头的每个字符串都返回1-
求和函数及其周围的[]将返回包含这些字符串计数的列表
最后的总和将为您提供所需的输出。
这应该回答您的两个问题!