3

次のリストがあるとします。

list1 = ["Box", "Stall"]
list2 = ["Ball", "Sox"]

「Ball」と「Sox」を構成するすべての文字(「BallSox」)が「BoxStall」(「Box」と「Stall」を構成する文字)に含まれているかどうかを確認するにはどうすればよいですか?彼らはどちらですか。大文字と小文字を区別する必要があります。

list()ifステートメント内でコマンド を使用して、「Box」のすべての文字が内にあるかどうかを確認しようとしましたlist2が、もう少し複雑にする必要があるようです。

4

4 に答える 4

2

これを処理する組み込み関数はないと思います。あなたができることは

# put all characters of first list into a dictionary 
# object.  This is easier to use for looking up characters
# later
list_chars = {}
for string in list1:
    for char in string:
        list_chars[char] = True


# run through second list, for each character
# in the other list, check if it exists in
# the dictionary of characters from the first 
# list.  If it does not, then set missing_character to True.
missing_character = False
for string in list2:
    for char in string:
        if not list_chars.get(char,False):
            # means that the first list does
            # not contain the character char
            missing_character = True


# print whether one list was actually missing a character.
if missing_character:
   print('Missing some character!')
else
   print('Contained all characters!')

上記の一部が意味をなさない場合は、お気軽にフォローアップの質問をしてください。また、上記の break ステートメントを使用すると、上記のコードを少し高速化できます。(リストに文字が欠けていることがすでにわかっている場合は、 for ループを早めに終了してください。) それは、あなたが興味を持っているかどうかを考えて判断するために残します。

于 2012-09-07T07:27:55.453 に答える
0

要素の1つのセットに別のセットの要素が含まれているかどうかを確認する自然な方法は、組み込みのを使用することsetです。

  • まず、の項目に含まれるすべての文字のセットを構築しますlist1

    target = set()
    for item in list1:
        target |= set(item)
    

    |=演算子を使用して、セットを変更していることに注意してください。セットの構成を1行にまとめることもできます。

    import operator
    target = reduce(operator.or_, (set(i) for i in list1)
    
  • ここで、繰り返してlist2、各アイテムの文字がセットに含まれているかどうかを確認する必要があります。

    for item in list2:
        if target.issuperset(item):
            print "item {0} passed the test".format(item)
        else:
            print "item {0} failed the test".format(item)
    

    このテストに対応するブール値のリストを作成できます。

    valid = [target.superset(i) for i in list2]
    

    そして、すべての要素がでテストに合格したかどうかall(valid)、または少なくとも1つがで合格したかどうかを確認しany(valid)ます...あなたはアイデアを得ることができます。

于 2012-09-07T08:19:33.160 に答える
0

次のようにしてはどうでしょうか。

  1. にあるすべての一意の文字のリストを取得しlist2ます。これを呼び出しましょうcharlist
  2. を調べて、 の単語の中に にないlist1文字がある場合は、それらを区切ります。list2charlist

パート 1 の場合:

>>> charset = set(''.join(i for i in list2))
>>> charset
set(['a', 'B', 'l', 'o', 'S', 'x'])

Asetは重複を許さない特殊な型です。すべてのアイテムは一意である必要があります。

パート 2 の場合:

>>> characters_missing = [x for x in ''.join(list1) if x not in charlist]
>>> len(characters_missing)
0

リスト内包表記を使用して結果の長さを計算するとcharlist、 from の単語にないfrom の文字数を調べることができますlist1

于 2012-09-07T07:33:34.517 に答える
0

join組み込み関数を使用すると、効率的なソリューションを実現できると思います。

>>> list1 = ["Box", "Stall"]
>>> list2 = ["Ball", "Sox"]
>>> def chars_subset(l1, l2):
    s1 = "".join(l1)
    s2 = "".join(l2)
    return not bool([c for c in s2 if c not in s1])

>>> chars_subset(list1, list2)
True
>>> list2 = ["Ball", "Soy"]
>>> chars_subset(list1, list2)
False
于 2012-09-07T07:37:48.880 に答える