2017-05-26 11 views
-2

辞書から2つのランダムキーを返すPythonコードがあります。返されたdictキーがリストにつながるかどうかの確認

key1,key2 = random.sample(stories.keys(), 2) 

事があり、辞書storiesもリストオブジェクトが含まれている、と私は、変数key1key2は文字列だけではなく、リストを含むようにしたいです。

stories辞書には多数のリストが含まれています。しかし、これらのリストにリストを含めることができます。だから、それは一種の、次のようになります

{ "thing1": [ 
     "Some text", 
     "Other text" 
      ], 
    "thing2": [ 
     "Some numbers", 
     "How about those 2?" 
      ], 
    "thing3": { 
     "Something else": [ 
          "More stuff", 
          "Even more stuff" 
          ] 
      }, 
    "thing4": [ 
      "Even more data", 
      "Yep, more data" 
      ] 
    } 

それでは、どのように私は2つのthing1の中のキー、thing2thing3、およびthing4を選んで、まだSomething elseを得ることができませんか?

を編集してください:リストを含まないキーを選択しようとしています。だから私はちょうどthing1thing2thing4の中から選択したいと思いますが、外出するのはthing3です。

私は物事を少し明確にするためにデータの例を更新しました。

+1

あなたの説明はやや混乱している多分これはあなたが近づくでしょう。あなたが投稿したコードでは、「物語」の重要な部分ではないので、「他のもの」を選択することはできません。 – jasonharper

+0

また、辞書 'stories'にはリストと辞書のみが含まれています。辞書値のいずれも文字列ではないので、' key1'と 'key2'は文字列を含むことができません。 – Khristos

+1

リストを含むキーを無視するのか、リストのすべての文字列を一緒に結合しようとしていますか?コメントで返信するだけではなく、これらの点を明確にするために質問を更新してください。 –

答えて

1

あなたはこのような望ましくないエントリは除外できます:私が正しくあなたを理解している場合、私はあなただけの単一レベルのリストをしたいと思うが、

dict((k,d[k]) for k in d if isinstance(d[k],list) and all(isinstance(x,str) for x in d[k])) 
+3

最近、 'if isinstance(obj、SomeType)'の代わりに 'if type(obj)== SomeType'を使用しているケースがたくさんあります。 'isinstance'は、' obj'が 'SomeType'のサブクラスで、' type(obj) 'と明示的に比較しない場合に認識するという利点があります。 'isinstance'は、第2引数で可能な型の集合を受け取ります。これは明示的なテストでもっと複雑な作業(' all'または複数の条件を使用する)を必要とします。 – PaulMcG

+1

@PaulMcGuireありがとう、改善された答え。 – piokuc

+0

@PaulMcGuireええ、私は 'isinstance()'の使用を考えていました。 – Ertain

0

dict((k,d[k]) for k in d if type(d[k]) == list and all(type(x) == str for x in d[k])) 

か、いっそのことをネストされたリストではありません。

あなたがチェックあなたがこの

if (stories[key][0] && isinstance(stories[key][0], list)): 
    #get the next random key 
0

のようなランダムなキーを生成するとき、あなたがthing1thing2ポイントへの文字列のリストの中から鍵を選んでいる意味するかを行うことができますか?

key_strings = (s for kv in stories.items() if isinstance(kv[1],list) for s in kv[1]) 
print(list(key_strings)) 

プリント:

['Some numbers', 'How about those 2?', 'Some text', 'Other text'] 
関連する問題