Ersetzen Sie ein Element X in einer Liste durch 0,5 * X.

Sep 16 2020

Ich habe eine Liste mit 33600 Elementen und muss jedes Element, das größer als 6000 ist, durch seine Hälfte ersetzen. Ich "übte" mit einer kleineren Liste und versuchte Folgendes:

List1 = {1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000};
ListNew = {};

Do[
 {
  Numb = Take[List1, n ;; n],
  NumbNew = 0.5 Numb,
  
  ConditionalExpression[Numb > 9000,

   ListNew = Append[ListNew, NumbNew]],

  ListNew = Append[ListNew, Numb]
  }
 ,
 {n, 1, Length[List1]}]

Ich möchte, dass ListNew so aussieht:

{1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 5000}

Aber was ich bekomme ist folgendes:

{5000, 1000, 5000, 2000, 5000, 3000, 5000, 4000, 5000, 5000,
5000, 6000, 5000, 7000, 5000, 8000, 5000, 9000, 5000, 10000 }}

Ich habe auch versucht, es zu benutzen If, aber es hat auch nicht funktioniert

Gibt es eine Möglichkeit, dies zu beheben?

Antworten

6 kglr Sep 16 2020 at 22:31
(# + # UnitStep[6000 - #])/2 & @ List1
{1000, 2000, 3000, 4000, 5000, 6000, 3500, 4000, 4500, 5000}
4 SjoerdSmit Sep 16 2020 at 22:21

Eine Methode, die der des OP nahe kommt:

ListNew = Table[
   If[TrueQ[n > 6000], 0.5 * n, n],
   {n, List1}
]
3 AlexeiBoulbitch Sep 16 2020 at 21:06

Versuche dies:

lst1 = {1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000};

lst1 /. x_ /; x > 6000 -> x/2

(*  {1000, 2000, 3000, 4000, 5000, 6000, 3500, 4000, 4500, 5000}  *)

Habe Spaß!

3 bills Sep 16 2020 at 21:17

Ein anderer Weg:

listnew = List1 (Boole[Thread[List1 <= 6000]] + 1/2 Boole[Thread[List1 > 6000]] )

{1000, 2000, 3000, 4000, 5000, 6000, 3500, 4000, 4500, 5000}

Der erste Boole ist 1, wenn die Listennummern kleiner als 6000 sind, und der zweite Boole ist 1/2 ... dies wird dann mit den Werten von List1 multipliziert.

3 m_goldberg Sep 16 2020 at 21:51

Die eingebauten Funktionen Piecewiseund Mapsind gut für solche Dinge. Definieren Sie einfach eine stückweise Funktion, die Ihre Bedingung implementiert, und ordnen Sie sie Ihrer Liste zu, um eine neue zu erhalten. Wie so:

With[{max = 9000}, f[x_] := Piecewise[{{x, x ≤ max}, {x/2, x > max}}]]
new = f /@ {1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000}

{1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 5000}

Diese präzisere Form funktioniert ebenfalls, ist jedoch etwas weniger lesbar:

With[{max = 9000}, f[x_] := Piecewise[{{x, x ≤ max}}, x/2]]
2 user1066 Sep 17 2020 at 14:38
lst//#.DiagonalMatrix[Clip[UnitStep[#-6000],{1,0},{1,1/2}]]&

{1000, 2000, 3000, 4000, 5000, 3000, 3500, 4000, 4500, 5000}

​