ලැයිස්තු අවබෝධය තුළ / වෙනත් නම්


976

පයිතන් හි පහත සඳහන් දෑ කරන්නේ කෙසේද?

row = [unicode(x.strip()) for x in row if x is not None else '']

අත්යවශ්යයෙන්ම:

  1. සියලුම නෝන්ස් හිස් නූල් වෙනුවට ආදේශ කරන්න
  2. ශ්‍රිතයක් සිදු කරන්න.

Answers:


1587

ඔබට එය සම්පූර්ණයෙන්ම කළ හැකිය. එය ඇණවුම් කිරීමේ ප්‍රශ්නයක් පමණි:

[unicode(x.strip()) if x is not None else '' for x in row]

සාමාන්යයෙන්,

[f(x) if condition else g(x) for x in sequence]

ifකොන්දේසි සහිත ලැයිස්තු අවබෝධය සඳහා පමණක්,

[f(x) for x in sequence if condition]

මෙය සැබවින්ම වෙනස් භාෂා සැකැස්මක්, කොන්දේසි සහිත ප්‍රකාශනයක් භාවිතා කරන බව සලකන්න , එය අවබෝධ කර ගැනීමේ වාක්‍ය ඛණ්ඩයේ කොටසක් නොවන අතර, ifපසුව for…inලැයිස්තු අවබෝධයේ කොටසක් වන අතර නැවත ලබා ගත හැකි ප්‍රභවයෙන් මූලද්‍රව්‍ය පෙරීමට භාවිතා කරයි .


යම් කොන්දේසියක් මත පදනම්ව ප්‍රකාශන අගයන් දෙකක් අතර තෝරා ගැනීමට ඔබට අවශ්‍ය සියලු අවස්ථාවන්හිදී කොන්දේසි සහිත ප්‍රකාශන භාවිතා කළ හැකිය. මෙය වෙනත් භාෂාවල පවතින තෘතීය ක්‍රියාකරුට?: සමාන වේ. උදාහරණයක් වශයෙන්:

value = 123
print(value, 'is', 'even' if value % 2 == 0 else 'odd')

147
මෙහි / වෙනත් නම් දැන් "ටර්නරි ඔපරේටර්" සින්ටැක්ස් බවත් එය තේරුම් ගැනීමේ සින්ටැක්ස් නොවන බවත් සලකන්න.
ඇඩම් වැන්ඩන්බර්ග්

8
ඒ නිසාම මම ත්‍රිමාණ ක්‍රියාකරු වරහන් තුළට දැමීමට කැමැත්තෙමි, එය පැහැදිලි කරන්නේ එය සාමාන්‍ය ප්‍රකාශනයක් මිස අවබෝධයක් නොවන බවයි.
ජොචෙන් රිට්සෙල්

17
එබැවින් උපක්‍රමය නම් “ලැයිස්තු සම්පීඩනයේදී මම ලියන්නේ මීට පෙර නම් වෙනත් කොටසක් ද එකතු කළ යුතුය” යන්නයි. මොකද මගේ l = [ 2, 3, 4, 5]එහෙනම් [x if x % 2 == 0 for x in l]මට වැරැද්දක් කරන්න [x if x % 2 == 0 else 200 for x in l]. ඔව්, මම ලිවිය යුතු එය පෙරීමට දන්නවා [ x for x in l if x % 2 == 0]. කරදර වීම ගැන කණගාටුයි. ඔබේ පිළිතුරට ස්තූතියි.
ග්‍රිජේෂ් චෞහාන්

5
මෙම පිඹුරා ලේඛන ද මිශ්ර ක්රියාකරු සඳහන් . එයට අනෙක් දේ අවශ්‍ය බව සලකන්න, නැතහොත් එය ක්‍රියා නොකරයි.
naught101

4
Rew ඩ්‍රූඩින් ලැයිස්තු අවබෝධය එහි ක්‍රියාකාරීත්වය අතරතුර බිඳීමට සහාය නොදක්වයි. එවිට ඔබට සාමාන්‍ය ලූපයක් භාවිතා කිරීමට සිදුවේ.
සිදුරු

44

එක මාර්ගයයි:

def change(f):
    if f is None:
        return unicode(f.strip())
    else:
        return ''

row = [change(x) for x in row]

එසේ වුවද ඔබට ඇත්තේ:

row = map(change, row)

නැතහොත් ඔබට ලැම්බඩා පේළියක් භාවිතා කළ හැකිය.


13
ifප්‍රකාශනයේ හෝ කේතයේ හෝ එහි elseප්‍රකාශන කොටසේ ඇති විය හැකි ව්‍යතිරේකයන් ඔබට හැසිරවීමට සිදු වූ විට මෙය භාවිතා කිරීමට හොඳ (සමහර විට පමණක්) තාක්‍ෂණයකි . පිළිගත් පිළිතුර සරල අවස්ථා සඳහා වඩා හොඳය.
මාර්ටිනෝ

41

පෙර පිළිතුරුවල නිශ්චිත ගැටළුව දැනටමත් විසඳා ඇත, එබැවින් ලැයිස්තු අවබෝධය තුළ කොන්දේසි භාවිතා කිරීමේ පොදු අදහස මම විසඳන්නෙමි.

ලැයිස්තු අවබෝධයක් තුළ කොන්දේසි ලිවිය හැකි ආකාරය පෙන්වන උදාහරණයක් මෙන්න:

X = [1.5, 2.3, 4.4, 5.4, 'n', 1.5, 5.1, 'a']     # Original list

# Extract non-strings from X to new list
X_non_str = [el for el in X if not isinstance(el, str)]  # When using only 'if', put 'for' in the beginning

# Change all strings in X to 'b', preserve everything else as is
X_str_changed = ['b' if isinstance(el, str) else el for el in X]  # When using 'if' and 'else', put 'for' in the end

පළමු ලැයිස්තු අවබෝධය සඳහා X_non_str, ඇණවුම:

කොන්දේසියක් නම් නැවත යෙදිය හැකි අයිතමය සඳහා ප්‍රකාශනය

සහ අවසාන ලැයිස්තු අවබෝධය සඳහා X_str_changed, ඇණවුම:

expression1 නම් තත්ත්වය වෙන expression2 සඳහා අයිතමය දී iterable

මම හැම විටම එය බව මතක තබා ගැනීම දුෂ්කර සොයා expression1 පෙර විය යුතුය නම් සහ expression2 පසු විය යුතුය වෙන . මගේ හිසට අවශ්‍ය වන්නේ දෙදෙනාම පෙර හෝ පසුව වීමයි.

එය සාමාන්‍ය භාෂාවට සමාන බැවින් එය නිර්මාණය කර ඇති බව මම අනුමාන කරමි, උදා: " වැසි වැටුනහොත් මට ඇතුළත සිටීමට අවශ්‍යයි, එසේ නොමැතිනම් මට පිටතට යාමට අවශ්‍යයි"

සරල ඉංග්‍රීසියෙන් ඉහත සඳහන් කළ ලැයිස්තු අවබෝධය වර්ග දෙක මෙසේ දැක්විය හැකිය:

සමඟ පමණක් if:

extract_apple සඳහා ඇපල් තුළ apple_box නම් apple_is_ripe

සහ සමඟ if/else

mark_apple නම් apple_is_ripe වෙන leave_it_unmarked සඳහා ඇපල් තුළ apple_box


39

මෙන්න තවත් නිදර්ශන උදාහරණයක්:

>>> print(", ".join(["ha" if i else "Ha" for i in range(3)]) + "!")
Ha, ha, ha!

ශ්‍රිතය මඟින් ජනනය කරන ලද අනෙකුත් සියලුම අගයන් සඳහා සහ if iඇගයීමට ලක් කරන කාරණය එය ගසාකයි . එබැවින් ලැයිස්තු අවබෝධය පහත පරිදි ඇගයීමට ලක් කරයි:False0Truerange()

>>> ["ha" if i else "Ha" for i in range(3)]
['Ha', 'ha', 'ha']

8

අනෙක් විසඳුම් තනි if/ elseඉදිකිරීම සඳහා විශිෂ්ටයි . කෙසේ වෙතත්, ලැයිස්තු අවබෝධය තුළ ඇති ත්‍රිමාණ ප්‍රකාශ කියවීමට අපහසුය.

ශ්‍රිතයක් භාවිතා කිරීම කියවීමේ හැකියාව සඳහා උපකාරී වේ, නමුත් එවැනි විසඳුමක් සිතියම්ගත කිරීම ආදානය වන වැඩ ප්‍රවාහයක දීර් extend කිරීමට හෝ අනුවර්තනය වීමට අපහසුය. ශබ්ද කෝෂයකට මෙම ගැටළු සමනය කළ හැකිය:

row = [None, 'This', 'is', 'a', 'filler', 'test', 'string', None]

d = {None: '', 'filler': 'manipulated'}

res = [d.get(x, x) for x in row]

print(res)

['', 'This', 'is', 'a', 'manipulated', 'test', 'string', '']

3

එය ලැයිස්තු අවබෝධය සිදු කරන ආකාරය සමඟ සම්බන්ධ වේ.

පහත සඳහන් කරුණු මතක තබා ගන්න:

[ expression for item in list if conditional ]

සමාන වේ:

for item in list:
    if conditional:
        expression

කොහෙද expression(අ වාක්යය තුල මෙම විෂය හා ක්රියා පදයේ පිණිස මාරු හිතන්නේ) තරමක් වෙනස් ආකෘතියක් වේ.

එමනිසා, ඔබේ කේතය [x+1 for x in l if x >= 45]මෙය කරයි:

for x in l:
    if x >= 45:
        x+1

කෙසේ වෙතත්, මෙම කේතය [x+1 if x >= 45 else x+5 for x in l]මෙය කරයි (නැවත සකස් කිරීමෙන් පසු expression):

for x in l:
    if x>=45: x+1
    else: x+5

0

/ පසුව / වෙනත් නම් ත්‍රිකෝණ අවශ්‍ය නොවේ. මගේ මතය අනුව ඔබේ ප්‍රශ්නය මෙම පිළිතුර ඉල්ලා සිටී:

row = [unicode((x or '').strip()) for x in row]

0

නැවත සැකසිය හැකි අයිතම වලින් ලැයිස්තුවක් සාදන්න

ප්‍රශ්න වලට නිශ්චිත පිළිතුරු ලබා දෙනවාට වඩා හැකි සියලු ආකාර පළමුව සාමාන්‍යකරණය කිරීම වඩාත් සුදුසු බව පෙනේ. එසේ නොමැති නම්, පිළිතුර තීරණය කළේ කෙසේදැයි පා er කයා නොදනී. හිසරදයක් ඇතිවීමට පෙර මා සිතූ සාමාන්‍යකරණය කළ ආකාර කිහිපයක් මෙන්න, අවසාන ස්වරූපයෙන් අවසාන වගන්තිය භාවිතා කළ හැකිද යන්න තීරණය කිරීමට උත්සාහ කරමි.

[expression1(item)                                        for item in iterable]

[expression1(item) if conditional1                        for item in iterable]

[expression1(item) if conditional1 else expression2(item) for item in iterable]

[expression1(item) if conditional1 else expression2(item) for item in iterable if conditional2]

itemකිසිදු කොන්දේසි සහිත වගන්තියක වටිනාකම භාවිතා කිරීම අවශ්‍ය නොවේ. conditional3ප්‍රතිදාන ලැයිස්තුවට අගයක් එක් කිරීමට හෝ නොකිරීමට ස්විචයක් ලෙස A භාවිතා කළ හැකිය.

නිදසුනක් ලෙස, මුල් නූල් ලැයිස්තුවෙන් හිස් නූල් හෝ සුදු පැහැති නූල් ඉවත් කරන නව ලැයිස්තුවක් නිර්මාණය කිරීම සඳහා:

newlist = [s for s in firstlist if s.strip()]

1
ටිම් ලෙස දෙවන එක් දෝෂයක් දෙන පිළිතුරු , ඔහුගේ අදහස් තුළ ද බලන්න , කොන්දේසි ප්රකාශ පිඹුරා Docs හි. ඒවා මට කියවිය නොහැකි තරම්ය. සාරාංශය: this if condition else thatසාමාන්‍ය ප්‍රකාශනයකට පමණක් අවසර ලැබේ. නොවේ value = this if condition(එය සාක්ෂාත් කරගත හැකිය value = this if condition else None)
ඇන්ඩෙරියම්

0

අවබෝධය තුළ ඔබට කොන්දේසිගත තර්කනය ඒකාබද්ධ කළ හැකිය:

 ps = PorterStemmer()
 stop_words_english = stopwords.words('english')
 best = sorted(word_scores.items(), key=lambda x: x[1], reverse=True)[:10000]
 bestwords = set([w for w, s in best])


 def best_word_feats(words):
   return dict([(word, True) for word in words if word in bestwords])

 # with stemmer
 def best_word_feats_stem(words):
   return dict([(ps.stem(word), True) for word in words if word in bestwords])

 # with stemmer and not stopwords
 def best_word_feats_stem_stop(words):
   return dict([(ps.stem(word), True) for word in words if word in bestwords and word not in stop_words_english])

0

ඔබට මෙය කරන්න පුළුවන්

row = [unicode(x.strip()) if x != None else '' for x in row]

ලැයිස්තු අවබෝධය සඳහා සමහර සින්ටැක්ස්:

[item if condition else item for item in items]
[f(item) if condition else value for item in items]
[item if condition for item in items]
[value if condition else value1 if condition1 else value2]

ලැයිස්තු අවබෝධය පිළිබඳ මඳක් පැහැදිලි කිරීමක් සහිතව මෙය ඉහළ පිළිතුරේ අනුපිටපතක් සේ පෙනේ.
බ්‍රයිලි ක්‍රිස්ටෝපර් ඔක්ස්ලි

-2
# coding=utf-8

def my_function_get_list():
    my_list = [0, 1, 2, 3, 4, 5]

    # You may use map() to convert each item in the list to a string, 
    # and then join them to print my_list

    print("Affichage de my_list [{0}]".format(', '.join(map(str, my_list))))

    return my_list


my_result_list = [
   (
       number_in_my_list + 4,  # Condition is False : append number_in_my_list + 4 in my_result_list
       number_in_my_list * 2  # Condition is True : append number_in_my_list * 2 in my_result_list
   )

   [number_in_my_list % 2 == 0]  # [Condition] If the number in my list is even

   for number_in_my_list in my_function_get_list()  # For each number in my list
]

print("Affichage de my_result_list [{0}]".format(', '.join(map(str, my_result_list))))

(venv) $ python list_comp.py
Affichage de my_list [0, 1, 2, 3, 4, 5]
Affichage de my_result_list [0, 5, 4, 7, 8, 9]

ඉතින්, ඔබ වෙනුවෙන්: row = [('', unicode(x.strip()))[x is not None] for x in row]


මොනවාද කරන්නේ? "Affichage ද ..." නපුරු? එය ප්‍රංශ ද?
පීටර් මෝර්ටෙන්සන්

Et පීටර්මෝර්ටෙන්සන් ප්‍රංශ යන්නෙහි තේරුම “ප්‍රදර්ශනය කිරීම / දළ විශ්ලේෂණය කිරීම” යන්නයි. ඉතින්Displaying / overview of my_result_list
නොමාඩ්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.