ฉันจะตรวจสอบว่ารายการหนึ่งเป็นส่วนย่อยของอีกรายการได้อย่างไร


185

ฉันต้องตรวจสอบว่ารายการนั้นเป็นชุดย่อยของอีกชุดหรือไม่ - การส่งคืนบูลีนคือสิ่งที่ฉันต้องการ

การทดสอบความเท่าเทียมกันในรายการเล็ก ๆ หลังจากทางแยกเป็นวิธีที่เร็วที่สุดในการทำเช่นนี้หรือไม่ ประสิทธิภาพมีความสำคัญสูงสุดตามจำนวนชุดข้อมูลที่ต้องเปรียบเทียบ

การเพิ่มข้อเท็จจริงเพิ่มเติมตามการอภิปราย:

  1. รายการใดรายการหนึ่งจะเหมือนกันสำหรับการทดสอบจำนวนมากหรือไม่ มันเป็นหนึ่งในนั้นคือตารางการค้นหาแบบคงที่

  2. มันจำเป็นต้องเป็นรายการหรือไม่? ไม่ - ตารางการค้นหาแบบสแตติกสามารถเป็นอะไรก็ได้ที่ทำงานได้ดีที่สุด ไดนามิกหนึ่งเป็น dict จากที่เราดึงกุญแจออกเพื่อทำการค้นหาแบบคงที่

อะไรจะเป็นทางออกที่ดีที่สุดในสถานการณ์


คุณพูดถึงความเร็วบางทีอาจจะมีประโยชน์ขึ้นอยู่กับการใช้งานของคุณ
ninMonkey

2
รายการมีการแฮช
Wim

2
ถ้าการสั่งซื้อเป็นสิ่งสำคัญนี่อาจเป็นการเริ่มต้นที่ดี - StackOverflow - วิธีที่ดีที่สุดในการตรวจสอบว่าลำดับอยู่ในลำดับอื่นใน Python หรือไม่

คุณต้องการเซตย่อยที่เหมาะสมหรือไม่
törzsmókus

2
ทำไมไม่ตั้งค่า (list_a) .issubset (set (list_b))
SeF

คำตอบ:


127

ฟังก์ชั่น performant set.issubsetหลามให้สำหรับเรื่องนี้คือ อย่างไรก็ตามมีข้อ จำกัด เล็กน้อยที่ทำให้ไม่ชัดเจนหากเป็นคำตอบสำหรับคำถามของคุณ

รายการอาจมีรายการหลายครั้งและมีคำสั่งซื้อที่เฉพาะเจาะจง ชุดไม่ นอกจากนี้การตั้งค่าใช้งานได้เฉพาะกับวัตถุที่แฮ

คุณกำลังถามเกี่ยวกับเซตย่อยหรือส่วนประกอบ (ซึ่งหมายความว่าคุณต้องการอัลกอริธึมการค้นหาสตริง)? รายการใดรายการหนึ่งจะเหมือนกันสำหรับการทดสอบจำนวนมากหรือไม่ ประเภทข้อมูลที่มีอยู่ในรายการคืออะไร? และสำหรับเรื่องนั้นจำเป็นต้องมีรายชื่อหรือไม่?

โพสต์อื่นของคุณตัดกับ dict และรายการทำให้ประเภทชัดเจนขึ้นและได้รับคำแนะนำให้ใช้มุมมองคีย์พจนานุกรมสำหรับการทำงานเหมือนชุด ในกรณีดังกล่าวเป็นที่รู้จักกันดีว่าทำงานเพราะปุ่มพจนานุกรมทำงานเหมือนชุด (มากก่อนที่เราจะมีชุดใน Python เราใช้พจนานุกรม) หนึ่งสงสัยว่าปัญหานี้เกิดขึ้นเฉพาะเจาะจงน้อยลงในสามชั่วโมง


ฉันหมายถึงชุดย่อยเท่านั้นและ บริษัท ผู้ออกหลักทรัพย์ดำเนินการได้ดี - ขอบคุณ อย่างไรก็ตามฉันอยากรู้เกี่ยวกับ 2 คำถามที่นี่ 1. รายการใดรายการหนึ่งจะเหมือนกันสำหรับการทดสอบจำนวนมากหรือไม่ มันเป็นหนึ่งในนั้นคือตารางการค้นหาแบบคงที่ 2. มันจำเป็นต้องเป็นรายการหรือไม่? ไม่ - ตารางการค้นหาแบบสแตติกสามารถเป็นอะไรก็ได้ที่ทำงานได้ดีที่สุด ไดนามิกหนึ่งเป็น dict จากที่เราดึงกุญแจออกเพื่อทำการค้นหาแบบคงที่ ความจริงเรื่องนี้จะเปลี่ยนแปลงวิธีการแก้ปัญหา?
IUnknown

ไม่มาก. กุญแจของพจนานุกรมนั้นเหมือนและถูกจัดเรียงในตารางแฮชแล้วดังนั้นการใช้ชุดสำหรับส่วนที่คงที่จะไม่ทำให้เกิดความยุ่งยากเพิ่มเติม โดยพื้นฐานแล้วความจริงที่ว่าหนึ่งคือ dict หมายความว่าคุณไม่จำเป็นต้องแปลงชิ้นส่วนคงที่เป็นชุด (คุณสามารถตรวจสอบทั้งหมด (itertools.imap (dict.has_key, mylist)) ด้วยประสิทธิภาพ O (n)
Yann Vernier

ฉันไม่ได้ undestand วิธีนี้ (หรือวิธีแก้ปัญหาอื่น ๆ ที่อาศัยชุด) สามารถเป็นคำตอบที่ยอมรับได้ที่นี่ คำถามเกี่ยวกับรายการและฉันคิดว่าเซตย่อยใน "ตรวจสอบว่ารายการหนึ่งเป็นส่วนย่อยของอีกชุด" ไม่ควรถูกนำไปใช้อย่างแท้จริง เมื่อการแปลงเป็นชุดข้อมูลใด ๆ ในองค์ประกอบที่ซ้ำกันจะหายไป แต่หากรายการเริ่มต้นสามารถมีองค์ประกอบเหล่านั้นได้อาจเป็นสิ่งสำคัญที่จะต้องตรวจสอบว่าพวกเขาปรากฏในรายการที่สองหรือไม่และพูดจริง ๆ ว่าองค์ประกอบทั้งหมดของรายการเดียว ภายในอื่น ๆ ชุดไม่ทำอย่างนั้น!
inVader

เรื่องของบริบท สิ่งนี้ได้รับการยอมรับในการช่วยเหลือผู้ถามและอธิบายความแตกต่าง เราได้รับแจ้งว่าผู้สมัครจะสามารถแสดงเป็นชุดได้ดังนั้นจึงเป็นภารกิจที่กำหนดไว้ กรณีของคุณอาจแตกต่างกันและความแตกต่างที่คุณพูดถึงนั้นจะถูกแก้ไขโดยใช้หลายชุดเช่นคอลเลกชันตัวนับ
Yann Vernier

141
>>> a = [1, 3, 5]
>>> b = [1, 3, 5, 8]
>>> c = [3, 5, 9]
>>> set(a) <= set(b)
True
>>> set(c) <= set(b)
False

>>> a = ['yes', 'no', 'hmm']
>>> b = ['yes', 'no', 'hmm', 'well']
>>> c = ['sorry', 'no', 'hmm']
>>> 
>>> set(a) <= set(b)
True
>>> set(c) <= set(b)
False

21
นี่ดูดีที่สุดและเขียนง่ายที่สุด แต่ที่เร็วที่สุดควรเป็น set(a).issubset(b) เพราะในกรณีนี้คุณแปลงaเป็นชุดเท่านั้น แต่ไม่ใช่bซึ่งช่วยประหยัดเวลา คุณสามารถใช้timeitเพื่อเปรียบเทียบเวลาที่ใช้ในสองคำสั่ง ตัวอย่างเช่นtimeit.repeat('set(a)<set(b)', 'a = [1,3,5]; b = [1,3,5,7]', number=1000) และ timeit.repeat('set(a).issubset(b)', 'a = [1,3,5]; b = [1,3,5,7]', number=1000)
Yulan Liu

8
@YulanLiu: เกลียดที่จะทำลายมันให้กับคุณ แต่สิ่งแรกที่issubsetทำคือตรวจสอบว่าอาร์กิวเมนต์เป็น a set/ frozensetและถ้าไม่ใช่มันจะแปลงเป็นชั่วคราวsetเพื่อทำการเปรียบเทียบตรวจสอบจากนั้นก็โยนทิ้งชั่วคราวset. ความแตกต่างด้านเวลา (ถ้ามี) จะเป็นปัจจัยที่มีความแตกต่างเล็กน้อยในค่าใช้จ่ายการค้นหาของ LEGB (การค้นหาsetครั้งที่สองมีราคาแพงกว่าการค้นหาแอตทริบิวต์ของที่มีอยู่set) แต่ส่วนใหญ่เป็นการล้างสำหรับอินพุตที่มีขนาดใหญ่
ShadowRanger

3
หากทั้งสองรายการมีค่าเหมือนกันค่านี้จะส่งคืนค่าเท็จควรตั้งเงื่อนไข (a) <= set (b) แทน
ssi-anik

2
คำตอบนี้จะถูกต้องอย่างไร เขาขอรายการไม่ใช่ชุด พวกเขาแตกต่างอย่างสิ้นเชิง เกิดอะไรขึ้นถ้า a = [1, 3, 3, 5, 5] และ b = [1, 3, 3, 3, 5] ทฤษฎีเซตไม่เหมาะสมสำหรับการทำซ้ำ
Eamonn Kenny

1
ฉันจะชี้ให้เห็นว่าถ้า a = [1,3,5] และ b = [1,3,5] ชุด (a) <set (b) จะกลับมาเป็นเท็จ คุณสามารถเพิ่มตัวดำเนินการเท่ากับเพื่อจัดการกับกรณีเหล่านี้: ie set (a) <= set (b)
Jon

37
one = [1, 2, 3]
two = [9, 8, 5, 3, 2, 1]

all(x in two for x in one)

คำอธิบาย: ตัวสร้างสร้างบูลีนโดยวนลูปผ่านการoneตรวจสอบรายการว่ามีรายการนั้นอยู่ในรายการtwoหรือไม่ all()ผลตอบแทนTrueถ้าทุกรายการเป็น truthy Falseอื่น

นอกจากนี้ยังมีข้อได้เปรียบที่allคืนค่าเท็จในอินสแตนซ์แรกขององค์ประกอบที่หายไปแทนที่จะต้องประมวลผลทุกรายการ


ฉันคิดว่าการอ่านง่ายและชัดเจนในสิ่งที่คุณพยายามจะทำset(one).issubset(set(two))คือทางออกที่ดี ด้วยวิธีที่ฉันโพสต์คุณควรจะสามารถใช้มันกับวัตถุใด ๆ หากพวกเขามีการกำหนดผู้ประกอบการเปรียบเทียบที่เหมาะสม
voidnologo

4
ใช้นิพจน์ตัวสร้างไม่ใช่รายการความเข้าใจ อดีตจะอนุญาตให้allลัดวงจรอย่างถูกต้องหลังจะทำการตรวจสอบทั้งหมดแม้ว่ามันจะมีความชัดเจนจากการตรวจสอบครั้งแรกว่าการทดสอบจะล้มเหลว all(x in two for x in one)เพียงแค่วางวงเล็บที่จะได้รับ
ShadowRanger

ฉันผิดหรือคุณไม่สามารถใช้วิธีนี้กับคนในท้องถิ่นได้
Homper

22

สมมติว่ารายการนั้นแฮช

>>> from collections import Counter
>>> not Counter([1, 2]) - Counter([1])
False
>>> not Counter([1, 2]) - Counter([1, 2])
True
>>> not Counter([1, 2, 2]) - Counter([1, 2])
False

หากคุณไม่สนใจรายการที่ซ้ำกันเช่น [1, 2, 2]และ[1, 2]จากนั้นใช้:

>>> set([1, 2, 2]).issubset([1, 2])
True

การทดสอบความเท่าเทียมกันในรายการเล็ก ๆ หลังจากทางแยกเป็นวิธีที่เร็วที่สุดในการทำเช่นนี้หรือไม่?

.issubsetจะเป็นวิธีที่เร็วที่สุดที่จะทำ การตรวจสอบความยาวก่อนการทดสอบissubsetจะไม่เพิ่มความเร็วเนื่องจากคุณยังมีรายการ O (N + M) เพื่อวนซ้ำและตรวจสอบ


6

intersectionทางออกหนึ่งที่มากขึ้นจะใช้

one = [1, 2, 3]
two = [9, 8, 5, 3, 2, 1]

set(one).intersection(set(two)) == set(one)

จุดตัดของเซตจะประกอบด้วย set one

(หรือ)

one = [1, 2, 3]
two = [9, 8, 5, 3, 2, 1]

set(one) & (set(two)) == set(one)

2
one = [1, 2, 3]
two = [9, 8, 5, 3, 2, 1]

set(x in two for x in one) == set([True])

หาก list1 อยู่ในรายการ 2:

  • (x in two for x in one)Trueสร้างรายการของ

  • เมื่อเราทำset(x in two for x in one)มีเพียงองค์ประกอบเดียว (True)


2

ทฤษฎีเซตไม่เหมาะสมสำหรับรายการเนื่องจากรายการซ้ำจะส่งผลให้เกิดคำตอบที่ผิดโดยใช้ทฤษฎีเซต

ตัวอย่างเช่น:

a = [1, 3, 3, 3, 5]
b = [1, 3, 3, 4, 5]
set(b) > set(a)

ไม่มีความหมาย ใช่มันให้คำตอบที่ผิด แต่ไม่ถูกต้องเนื่องจากทฤษฎีเซตเพิ่งเปรียบเทียบ: 1,3,5 เทียบกับ 1,3,4,5 คุณต้องรวมรายการที่ซ้ำกันทั้งหมด

แต่คุณต้องนับการเกิดขึ้นของแต่ละรายการและทำมากกว่าการตรวจสอบ สิ่งนี้ไม่แพงมากเพราะไม่ได้ใช้การดำเนินการ O (N ^ 2) และไม่ต้องการการเรียงลำดับอย่างรวดเร็ว

#!/usr/bin/env python

from collections import Counter

def containedInFirst(a, b):
  a_count = Counter(a)
  b_count = Counter(b)
  for key in b_count:
    if a_count.has_key(key) == False:
      return False
    if b_count[key] > a_count[key]:
      return False
  return True


a = [1, 3, 3, 3, 5]
b = [1, 3, 3, 4, 5]
print "b in a: ", containedInFirst(a, b)

a = [1, 3, 3, 3, 4, 4, 5]
b = [1, 3, 3, 4, 5]
print "b in a: ", containedInFirst(a, b)

จากนั้นเรียกใช้สิ่งนี้คุณจะได้รับ:

$ python contained.py 
b in a:  False
b in a:  True

1

เนื่องจากไม่มีใครพิจารณาเปรียบเทียบสองสายนี่คือข้อเสนอของฉัน

แน่นอนคุณอาจต้องการตรวจสอบว่าไปป์ ("|") ไม่ได้เป็นส่วนหนึ่งของรายการใดรายการหนึ่งหรือไม่และอาจเลือกตัวเลือกอื่นโดยอัตโนมัติ แต่คุณมีความคิด

การใช้สตริงว่างเป็นตัวคั่นไม่ใช่วิธีการแก้ปัญหาเนื่องจากตัวเลขสามารถมีหลายหลัก ([12,3]! = = 1,23]

def issublist(l1,l2):
    return '|'.join([str(i) for i in l1]) in '|'.join([str(i) for i in l2])

0

ให้อภัยฉันถ้าฉันไปงานปาร์ตี้สาย ;)

ในการตรวจสอบหากset Aมีการย่อยของset B, PythonมีและA.issubset(B) A <= Bใช้งานได้setเฉพาะและใช้งานได้ดีแต่ไม่ทราบความซับซ้อนของการใช้งานภายใน การอ้างอิง: https://docs.python.org/2/library/sets.html#set-objects

ฉันใช้อัลกอริทึมเพื่อตรวจสอบว่าlist Aเป็นเซตย่อยของlist Bคำพูดต่อไปนี้หรือไม่

  • เพื่อลดความซับซ้อนในการค้นหาชุดย่อยฉันพบว่ามันเหมาะสมกับ sortทั้งสองรายการก่อนที่จะเปรียบเทียบองค์ประกอบเพื่อมีสิทธิ์ได้รับชุดย่อย
  • มันช่วยให้ฉันเพื่อเมื่อค่าขององค์ประกอบของรายการที่สองมีค่ามากกว่าค่าขององค์ประกอบของรายการแรกbreakloopB[j]A[i]
  • last_index_jจะใช้เพื่อเริ่มต้นใหม่loopเมื่อlist Bที่เหลือ มันช่วยหลีกเลี่ยงการเริ่มเปรียบเทียบจากจุดเริ่มต้น list B(ซึ่งก็คือคุณอาจเดาว่าไม่จำเป็นที่จะเริ่มlist Bจากindex 0ในภายหลังiterations)
  • ความซับซ้อนจะมีO(n ln n)การเรียงลำดับทั้งรายการและO(n)การตรวจสอบชุดย่อย
    O(n ln n) + O(n ln n) + O(n) = O(n ln n).

  • รหัสมีจำนวนมากของprintงบที่จะเห็นสิ่งที่เกิดขึ้นในแต่ละของiteration loopสิ่งเหล่านี้มีไว้เพื่อความเข้าใจเท่านั้น

ตรวจสอบว่ารายการหนึ่งเป็นส่วนย่อยของรายการอื่น

is_subset = True;

A = [9, 3, 11, 1, 7, 2];
B = [11, 4, 6, 2, 15, 1, 9, 8, 5, 3];

print(A, B);

# skip checking if list A has elements more than list B
if len(A) > len(B):
    is_subset = False;
else:
    # complexity of sorting using quicksort or merge sort: O(n ln n)
    # use best sorting algorithm available to minimize complexity
    A.sort();
    B.sort();

    print(A, B);

    # complexity: O(n^2)
    # for a in A:
    #   if a not in B:
    #       is_subset = False;
    #       break;

    # complexity: O(n)
    is_found = False;
    last_index_j = 0;

    for i in range(len(A)):
        for j in range(last_index_j, len(B)):
            is_found = False;

            print("i=" + str(i) + ", j=" + str(j) + ", " + str(A[i]) + "==" + str(B[j]) + "?");

            if B[j] <= A[i]:
                if A[i] == B[j]:
                    is_found = True;
                last_index_j = j;
            else:
                is_found = False;
                break;

            if is_found:
                print("Found: " + str(A[i]));
                last_index_j = last_index_j + 1;
                break;
            else:
                print("Not found: " + str(A[i]));

        if is_found == False:
            is_subset = False;
            break;

print("subset") if is_subset else print("not subset");

เอาท์พุต

[9, 3, 11, 1, 7, 2] [11, 4, 6, 2, 15, 1, 9, 8, 5, 3]
[1, 2, 3, 7, 9, 11] [1, 2, 3, 4, 5, 6, 8, 9, 11, 15]
i=0, j=0, 1==1?
Found: 1
i=1, j=1, 2==1?
Not found: 2
i=1, j=2, 2==2?
Found: 2
i=2, j=3, 3==3?
Found: 3
i=3, j=4, 7==4?
Not found: 7
i=3, j=5, 7==5?
Not found: 7
i=3, j=6, 7==6?
Not found: 7
i=3, j=7, 7==8?
not subset

หากคุณจัดเรียงพวกเขาไม่มีเหตุผลใด ๆ ที่จะใช้รายการแทนชุด ...
LtWorf

0

โค้ดด้านล่างตรวจสอบว่าชุดที่กำหนดเป็น "ชุดย่อยที่เหมาะสม" ของชุดอื่น

 def is_proper_subset(set, superset):
     return all(x in superset for x in set) and len(set)<len(superset)

1
ทำไมอุดมคติของคุณสำหรับเซตที่ว่างเปล่าเพื่อทำลายกฎทางคณิตศาสตร์ที่สร้างขึ้น? วิกิพีเดีย: เซตว่าง {} ซึ่งเขียนแทนด้วย∅เป็นเซตย่อยของเซต X ที่กำหนดนอกจากนี้ยังเป็นเซตย่อยที่เหมาะสมของชุดใด ๆ ยกเว้นตัวมันเอง
Yann Vernier

ขอบคุณ @YannVernier ฉันได้แก้ไขเพื่อรวมการตรวจสอบที่ว่างเปล่าสำหรับทั้งเซ็ตย่อยและซูเปอร์เซ็ตดังนั้นมันจึงส่งคืนค่าเท็จเมื่อทั้งคู่ว่างเปล่า
Leo Bastin

แต่ทำไมคุณถึงทำเช่นนี้? สำหรับ A เป็นเซตย่อยของ B หมายถึง A ไม่มีรายการที่ไม่ได้อยู่ใน B หรือเทียบเท่ารายการทั้งหมดใน A อยู่ใน B ดังนั้นเซตว่างจึงเป็นชุดย่อยของเซตทั้งหมดรวมถึงตัวมันเอง การตรวจสอบพิเศษของคุณยืนยันว่าไม่ได้และคุณยืนยันว่านี่เป็นอุดมคติอย่างใด แต่มันตรงกันข้ามกับคำศัพท์ที่กำหนดขึ้น ข้อดีคืออะไร
Yann Vernier

ขอบคุณ @YannVernier ตอนนี้รหัสตรวจสอบว่าชุดที่กำหนดเป็น "ชุดย่อยที่เหมาะสม" ของชุดอื่น
Leo Bastin

นี่คือไม่ดีเท่าที่ตอบพึ่งพาการใช้งานของชุด ในขณะที่พูดทางคณิตศาสตร์ชุดคือชุดขององค์ประกอบที่แตกต่างเราสามารถและไม่ควรพึ่งพาสมมติฐานที่ว่าเมื่อตรวจสอบว่ารายการหนึ่งเป็นส่วนหนึ่งของอีก หากรายการเริ่มต้นมีการซ้ำซ้อนฟังก์ชันของคุณยังคงสามารถคืนค่าTrueแม้ว่าองค์ประกอบที่เป็นปัญหาจะปรากฏในรายการที่สองเพียงครั้งเดียว ฉันไม่คิดว่านี่เป็นพฤติกรรมที่ถูกต้องเมื่อพยายามเปรียบเทียบรายการ
inVader

0

ใน python 3.5 คุณสามารถทำ[*set()][index]เพื่อรับองค์ประกอบ มันเป็นทางออกที่ช้ากว่าวิธีอื่น ๆ

one = [1, 2, 3]
two = [9, 8, 5, 3, 2, 1]

result = set(x in two for x in one)

[*result][0] == True

หรือเพียงแค่มี len และตั้ง

len(set(a+b)) == len(set(a))

0

นี่คือวิธีที่ฉันรู้ว่าหากรายการหนึ่งเป็นส่วนย่อยของอีกรายการหนึ่งลำดับสำคัญสำหรับฉันในกรณีของฉัน

def is_subset(list_long,list_short):
    short_length = len(list_short)
    subset_list = []
    for i in range(len(list_long)-short_length+1):
        subset_list.append(list_long[i:i+short_length])
    if list_short in subset_list:
        return True
    else: return False

0

โซลูชันส่วนใหญ่พิจารณาว่ารายการไม่มีรายการที่ซ้ำกัน ในกรณีที่รายการของคุณมีรายการซ้ำคุณสามารถลอง:

def isSubList(subList,mlist):
    uniqueElements=set(subList)
    for e in uniqueElements:
        if subList.count(e) > mlist.count(e):
            return False     
    # It is sublist
    return True

มันทำให้รายการย่อยไม่เคยมีองค์ประกอบที่แตกต่างจากรายการหรือองค์ประกอบทั่วไปจำนวนมาก

lst=[1,2,2,3,4]
sl1=[2,2,3]
sl2=[2,2,2]
sl3=[2,5]

print(isSubList(sl1,lst)) # True
print(isSubList(sl2,lst)) # False
print(isSubList(sl3,lst)) # False

-1

หากคุณถามว่ามีรายการ "มีอยู่" ในรายการอื่นหรือไม่:

>>>if listA in listB: return True

หากคุณถามว่าองค์ประกอบแต่ละรายการใน listA มีองค์ประกอบการจับคู่ใน listB เท่ากันหรือไม่ลอง:

all(True if listA.count(item) <= listB.count(item) else False for item in listA)

มันไม่ได้ผลสำหรับฉัน ส่งคืนค่าเท็จแม้ว่า listA == listB
cass

@cass ฉันได้ทดสอบกับสตริงเท่านั้น ลองสิ่งนี้บนเครื่องของคุณ pastebin.com/9whnDYq4
DevPlayer

ฉันหมายถึงส่วน "if listA ใน listB: return True" ไม่ใช่ส่วนที่สอง
cass

@cass พิจารณา: ['หนึ่ง', 'สอง'] ใน ['หนึ่ง', 'สอง'] ให้ผลเป็นเท็จ ['หนึ่ง', 'สอง'] ใน ['หนึ่ง', 'สอง', 'สาม'] ให้ผลเป็นเท็จ ['หนึ่ง', 'สอง'] ใน [['หนึ่ง', 'สอง'], 'สาม'] ให้ผลจริง ดังนั้นใช่ถ้า listA == ListB ดังนั้น listA ใน listB จะส่งคืนค่า False เสมอเพราะ listA จะต้องเป็นองค์ประกอบรายการภายใน listB บางทีคุณอาจกำลังคิด: listA ใน listB หมายถึง "Are items in listA แสดงรายการเป็น list ใน listB นั่นไม่ใช่ความหมายของ listA ใน listB
DevPlayer

@ คาสอาฉันเห็นว่าโพสต์ของฉันสับสนอย่างไร โพสต์ต้นฉบับขอให้ทดสอบ listA ว่าเป็นส่วนย่อยของ listB ในทางเทคนิคโพสต์ของฉันผิดตามคำถามของโพสต์ดั้งเดิม เพื่อให้ถูกต้องคำถามจะต้องถามว่า "ถ้า listA ใน [item0, item2, listA, item3, listA,]" ไม่ใช่ "รายการใน ['a', 'b', 'c'] ใน ['d', 'c', 'f', 'a', 'b', 'a']"
DevPlayer

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.